剑指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 class Solution {
 2 public:
 3     vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
 4         vector<int> res;
 5         if(size == 0) return res;
 6         deque<int> myDeque;
 7         int numSize = num.size();
 8         for(int i = 0; i < numSize; i++) {
 9             if(myDeque.size() && i - myDeque.front() + 1 > size) myDeque.pop_front();
10             while(myDeque.size() && num[myDeque.back()] <= num[i]) myDeque.pop_back();
11             myDeque.push_back(i);
12             if(i + 1 >= size)
13                 res.push_back(num[myDeque.front()]);
14         }
15         return res;
16     }
17 };
原文地址:https://www.cnblogs.com/jacen789/p/7747810.html