滑动窗口最大值
Posted pacino12134
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滑动窗口最大值相关的知识,希望对你有一定的参考价值。
用一个双端队列,队首是当前窗口最大值索引。
滑动一次,判断当前最大值是否过期;
新增的值从尾开始比较,把所有比他小的值都丢掉。
例如2,3,4,2,6,5,1,3,2,窗口3
deque max
2 0 2
23 1 3
234 2 4 此时队列长度达到3,开始输出第一个窗口的最大值即队首
342 2,3 4
426 4 6
265 4,5 6
6514,5,6 6
513 5,7 5
132 7 3
class Solution public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) vector<int> res; deque<int> s;//保存窗口最大值的索引 for(unsigned int i=0;i<num.size();i++) while(s.size()&&num[s.back()]<=num[i])//只统计当前窗口内的最大值,所以要全部出队,碰到比当前值小的,说明s最前面已经不是最大值了,从后往前出队列 s.pop_back(); while(s.size()&&i-s.front()+1>size) s.pop_front(); s.push_back(i); if(size&&i+1>=size)//当i第一次走到了窗口边界,这才开始王res里面放最大值 res.push_back(num[s.front()]); return res; ;
以上是关于滑动窗口最大值的主要内容,如果未能解决你的问题,请参考以下文章