zoukankan      html  css  js  c++  java
  • 64、剑指offer--滑动窗口最大值

    题目描述
    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
     
    解题思路:本题使用双端队列来处理,双端队列实现窗口的更新。
    插入规则(保证队头对应值最大):
    1)为空时,下标i放入qmax中
    2)不为空,取当前qmax队尾下标j,如果arr[j]>arr[i]将i放入队尾,否则,则一直qmax中弹出队尾,直到某一下标使得qmax中对应值arr[j]>arr[i],将i放入队尾。
    弹出规则:
    1)qmax队头下标等于i-w,弹出队头(已出窗口)
     1 class Solution {
     2 public:
     3     vector<int> maxInWindows(const vector<int>& num, unsigned int size)
     4     {
     5         vector<int> result;
     6         if(num.size() == 0 || size < 1)
     7             return result;
     8         deque<int> qmax;
     9         for(int i=0;i<num.size();i++)
    10         {
    11             if(qmax.empty())
    12             {
    13                 qmax.push_back(i);
    14             }
    15             else
    16             {
    17                 while(!qmax.empty() && num[qmax.back()] <= num[i])
    18                 {
    19                     qmax.pop_back();
    20                 }
    21                 qmax.push_back(i);
    22             }
    23             if(qmax.front() == i-size)//去除掉超出当前窗口的下标
    24             {
    25                 qmax.pop_front();
    26             }
    27             if( i >= size-1)//第一次需要处理w个然后才开始存入最大值res
    28             {
    29                 result.push_back(num[qmax.front()]);
    30             }
    31         }
    32         return result;
    33     }
    34 };
  • 相关阅读:
    P5737 【深基7.例3】闰年展示
    P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
    P1597 语句解析
    P5735 【深基7.例1】距离函数
    P1553 数字反转(升级版)
    P1598 垂直柱状图
    P1603 斯诺登的密码
    P5738 【深基7.例4】歌唱比赛
    Ext.GridPanel 用法总结(一)—— Grid基本用法
    使用CodeSmith快速规范开发.Net软件
  • 原文地址:https://www.cnblogs.com/qqky/p/7125974.html
Copyright © 2011-2022 走看看