题目介绍
给定一个数组 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 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7
提示:
你可以假设 k 总是有效的,在输入数组 不为空 的情况下,1 ≤ k ≤ nums.length
。
解答
class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {// 单调递减队列int n = nums.size();deque<int> deq; // 存储的是nums的下标vector<int> res;// 当 i >= k-1形成窗口for(int i = 0; i < n; ++i){// deq.front() 表示最前面元素的下标// 窗口移动while(!deq.empty() && i - deq.front() + 1 > k) deq.pop_front();// 保证队列单调递减(队头到队尾)while(!deq.empty() && nums[deq.back()] <= nums[i]) deq.pop_back();deq.push_back(i);if(i >= k - 1){res.push_back(nums[deq.front()]); // 队头始终最大}}return res;}
};