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 };
  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/qqky/p/7125974.html
Copyright © 2011-2022 走看看