码迷,mamicode.com
首页 > 其他好文 > 详细

滑动窗口最大值

时间:2019-07-30 15:40:04      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:双端队列   image   nbsp   从后往前   i++   span   com   比较   size   

技术图片

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

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

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

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

 

滑动窗口最大值

标签:双端队列   image   nbsp   从后往前   i++   span   com   比较   size   

原文地址:https://www.cnblogs.com/pacino12134/p/11270191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!