题目描述
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
思路:
设计一个单调非递增双向队列,这样每次滑动,队首保存的就是当前的最大值
C++ 代码
#include<vector>
#include<deque>
using namespace std;
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
if(k==0||nums.size()==0)return vector<int>();
int l = 0;int r = 0;
int max_val = -1;
deque<int> q;
vector<int>res;
while(r<k){
while(!q.empty()&&q.back()<nums[r])q.pop_back();
q.push_back(nums[r]);
r++;
}
res.push_back(q.front());
while(r<nums.size()){
if(q.front()==nums[l])q.pop_front();
while(!q.empty()&&q.back()<nums[r])q.pop_back();
q.push_back(nums[r]);
res.push_back(q.front());
r++;
l++;
}
return res;
}
};