给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

思路:这道题感觉很难理解,先看的剑指offer,那上面很好理解,但是给出的代码很不懂,看下面的版本,使用双端队列deque,对队列和双端队列非常不懂,

queue的首先从左到右压入元素,最先压入的元素在右侧,叫队头使用front进行访问,最后push的元素使用back进行访问。

deque首先压入的元素也是在队头,使用front访问,压入使用pop_front,队尾使用back访问,压入队尾是pop_back。

访问里面的元素只能访问端口,不能使用迭代器进行访问。

front(),back()操作前一定要判断容器的尺寸不能为0

本题使用deque,结果存在数组里面,首先使用一个循环将队列中队首前面小于当前元素的都删除,队列里面存储的是元素下标,这样做的好处是可以很容易判断当前元素是否已经超出滑动窗口,这里是使用front,然后使用判断是否超出滑动窗口的尺寸,因为back元素是最先压入的,(pop_front压元素,back是最先压入的元素),所以if判断当前下标和back之间相差的个数是否大于滑动窗口*(首-尾+1),不管怎样,都需要将该元素压进去,然后判断,这里很难想到。最后因为前size元素是特殊情况,滑动窗口还没满,需要特殊处理。

class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size){
vector<int> res;
deque<int> s;
for(unsigned int i=;i<num.size();++i){
while(s.size() > && num[s.front()]<=num[i])
//如果队首元素小于当前元素,则弹出,不可能成为最大值
s.pop_front(); if(s.size() > && i-s.back()+>size)//front(),back()操作前一定要判断容器的尺寸不能为0
//back元素最先放进去的,所以和back的下标比较
s.pop_back();
s.push_front(i);//把每次滑动的num下标加入队列
if(size && i+>=size)//当滑动窗口首地址i大于等于size时才开始写入窗口最大值
res.push_back(num[s.back()]);
}
return res;
}
};

最新文章

  1. [iOS] 为文本加上横线方法
  2. IDE-Sublime【3】-配置Node.js开发环境
  3. 生成uuid
  4. github管理代码
  5. linux系统目录架构
  6. CentOS6.3安装VBoxAdditions
  7. CentOS虚拟机不能联网状况下yum方式从本地安装软件包(转载的)
  8. MYSQL数据库命名与其设计规范
  9. 我用过的Linux命令--修改主机名
  10. 向ibus-table-wubi里添加属于自己的输入法(98五笔)
  11. Hadoop-2.2.0中文文档—— MapReduce下一代- 可插入的 Shuffle 和 Sort
  12. r.js实践
  13. JavaScript 历史漫谈
  14. Apache的安装与配置
  15. 初识Quartz (一)
  16. thumbs.db是什么文件
  17. python基础之 序列 pickle&amp;json
  18. 快速排序的C++实现
  19. SharePoint 2016 安装 Cumulative Update for Service Bus 1.0 (KB2799752)报错
  20. PHP之curl扩展

热门文章

  1. scp--linux命令
  2. 基于G6画个xmind出来
  3. 容器远程访问vnc--CentOS 6.8安装和配置VNC
  4. C:变量的声明与定义
  5. Android系统架构(图解)
  6. 无数据库模式kong/kong-ingress-controller
  7. JS线程及回调函数执行
  8. Maven与Nexus
  9. Python3中reduce和lambda的用法
  10. pycharm 右键无法显示unittest框架&amp;&amp;解决右键只有unittest 运行如何取消右键显示进行普通run