zoukankan      html  css  js  c++  java
  • 【剑指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)

    # 测试用例

          

     

  • 相关阅读:
    安装 Cacti 监控
    增加yum源方式 安装升级 Mysql
    Yum
    Cacti 抓取数据方式 安装spine
    Linux 目录解析
    Linux 发行版本简述
    php 安装扩展插件实例-ftp.so
    Crontab 计划任务
    文本处理命令 cat more less cut wc sort uniq
    grep命令
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/9036452.html
Copyright © 2011-2022 走看看