滑动窗口最大值

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;
    
;

 

以上是关于滑动窗口最大值的主要内容,如果未能解决你的问题,请参考以下文章

JZ-064-滑动窗口的最大值

滑动窗口的最大值

java LeetCode - 滑动窗口maxmum滑动窗口最大值

Leetcode 239.滑动窗口最大值

剑指offer--滑动窗口最大值

滑动窗口最大值