滑动窗口最大值

用一个双端队列,队首是当前窗口最大值索引。

滑动一次,判断当前最大值是否过期;

新增的值从尾开始比较,把所有比他小的值都丢掉。

例如{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

651{4,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;
    }
};
原文地址:https://www.cnblogs.com/pacino12134/p/11270191.html