zoukankan      html  css  js  c++  java
  • 滑动窗口最大值

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

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

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

    例如{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;
        }
    };
  • 相关阅读:
    004 连接查询
    003 常用函数说明
    003 限定查询
    002 基础查询
    001 基础数据表脚本
    001 redis的简介和重点
    006 表单组件
    005 基本表单
    004 表格元素
    谚语,
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11270191.html
Copyright © 2011-2022 走看看