博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8.最大滑动窗口问题
阅读量:5172 次
发布时间:2019-06-13

本文共 927 字,大约阅读时间需要 3 分钟。

  题设:有一个整型数组arr和一个大小为w的窗口,窗口从数组的最左边滑到最右边,窗口每次向右边滑动一个位置。列如数组arr为[4,3,5,4,3,3,6,7],当窗口w大小为3时,滑动过程如下图:

如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口最大值,请实现一个函数。

分析:

  本题可以用一个双端队列queue来模拟一个窗口,queue中存储数组值对应的下标,则实现该函数的时间复杂度为O(N);

  比如从arr[i]开始滑动,如果此时queue为空,则可直接将i添加到队列queue中,如果此时queue的队尾元素大于arr[i],则将i直接添加到queue的队尾,反之则弹出queue的队尾元素,继续比较arr[i]与queue最新的队尾元素,直到queue最新的队尾元素大于arr[i]或者queue为空时,将i添加到queue的队尾。此时如果queue队头元素等于i-w时则弹出当前的队头元素,因为此时队头元素已经无效。这样当滑动到数组最后一个元素时,数组中的下标只进入或弹出队列一次,所以时间复杂度为O(N)。

附如下代码:

public static int[] getMaxWindow(int[] arr,int w){        if(arr.length
<1){ return null; } int[] result=new int[arr.length-w+1]; LinkedList
queue=new LinkedList<>(); for(int i=0;i
=w-1){ result[i-w+1]=arr[queue.peekFirst()]; } } return result; }

 

转载于:https://www.cnblogs.com/quxiangxiangtiange/p/10372379.html

你可能感兴趣的文章
【MySQL性能优化】MySQL常见SQL错误用法
查看>>
Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
查看>>
Struts 2 常用技术
查看>>
树形DP
查看>>
python flask解决上传下载的问题
查看>>
语法测试
查看>>
CES1
查看>>
CES2
查看>>
文件方式实现完整的英文词频统计实例
查看>>
单个SWF文件loading加载详解(转)
查看>>
SQLServer中的CTE通用表表达式
查看>>
C# 3.0 LINQ的准备工作
查看>>
静态代码审查工具FxCop插件开发(c#)
查看>>
创建代码仓库
查看>>
理解裸机部署过程ironic
查看>>
Django 组件-ModelForm
查看>>
zabbix 二 zabbix agent 客户端
查看>>
大数据分析中,有哪些常见的大数据分析模型?
查看>>
如何防止Arp攻击
查看>>
ClassList 标签的用法
查看>>