首页 > 编程语言 > 详细

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

时间:2018-05-14 16:05:38      阅读:385      评论:0      收藏:0      [点我收藏+]

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

# 题目

技术分享图片

# 思路

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

找出数组中大小为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)

# 测试用例

      

 

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

原文:https://www.cnblogs.com/wanglei5205/p/9036452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!