• 【剑指offer】滑动窗口的最大值,C++实现


    原创博文,转载请注明出处!

    # 题目

    image

    # 思路

          利用C++中的双端队列保存有可能是滑动窗口最大值的下标,其中队首元素保存当前窗口最大值的下标。当滑动窗口改变时,更新队列。队列更新的规则:(1)新元素依次与队尾元素比较,如果队尾元素小于新元素,则删除队尾元素,直至队列中没有小于新元素的值。(2)更新队首元素,如果队首元素不在新滑动窗口中,则删除队首元素。(3)把每次滑动的数字的下标压入队列image

    找出数组中大小为3的滑动窗口的最大值,在队列中的下标一列,小括号前面的数字表示数字在数组中的下标。

    # 代码

      1 #include <iostream>
      2 #include <vector>
      3 #include <queue>
      4 using namespace std;
      5 
      6 class Solution {
      7 public:
      8     vector<int> maxInWindows(const vector<int>& num, unsigned int size)
      9     {
     10         vector<int> res; // 存储每个滑动窗口的最大值
     11         deque<int> s;    // 保存滑动窗口最大值数字的下标
     12 
     13         for(unsigned int i=0;i<num.size();++i)
     14         {
     15             // 更新队列:删除小于新元素的值
     16             while(s.size() && num[s.back()]<=num[i])
     17                 s.pop_back();
     18 
     19             // 更新队列:更新队首元素
     20             if(s.size() && i-s.front()+1>size)
     21                 s.pop_front();
     22 
     23             // 更新队列:新元素的下标加入队列
     24             s.push_back(i);
     25 
     26             // 存储结果
     27             if(size&&i+1>=size)
     28                 res.push_back(num[s.front()]);
     29         }
     30         return res;
     31     }
     32 };
     33 int main()
     34 {
     35     unsigned int size = 3;
     36     const vector<int> num = {1,2,3,4,5,6,7,8,9};
     37 
     38     Solution solution;
     39     solution.maxInWindows(num,size);
     40     return 0;
     41 }
     42 
    View Code

    # 复杂度

           O(n)

    # 测试用例

          

     

  • 相关阅读:
    LINUX安装 RPM与YUM
    ln s 软链接知识总结
    JQuery EasyUI 之 combobox plugin
    域名的DNS解析指南
    Asp.NET + OWC 输出Chart(图表)
    打败 IE 的葵花宝典:CSS Bug Table
    Route命令使用详解
    JQuery EasyUI 之 validatebox plugin
    JQuery easyUI 之 datebox plugin
    [转]如何安全的存储密码
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/9036452.html
Copyright © 2020-2023  润新知