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 };
  • 相关阅读:
    自定义Android核心服务实践
    RootExplorer怎么样获取root权限的
    android性能测试工具之dumpsys
    gettimeofday() 获取当前时间(保存在结构体timeval中)
    Android学习之Service命令的妙用
    linux内存管理之非连续物理地址分配(vmalloc)
    Android dumpsys
    Linux下进程信息的深入分析
    Android调试工具之adbs
    如何分析Android的内存使用
  • 原文地址:https://www.cnblogs.com/qqky/p/7125974.html
Copyright © 2011-2022 走看看