【剑指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)

# 测试用例

      

 

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