每日刷题第4天 2021.12.29
I. 滑动窗口的最大值
- 难度:困难
题目
- 给定一个数组
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
提示
- 你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小。
解法
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function(nums, k) {
// 单调队列的应用
// 定义一个单调队列,记录原数组最大值的下标
let arr = [];
// console.log('初始arr', arr);
// 记录当前窗口大小
let temp = 0;
let ans = [];
// 标记变量
let flag = false;
for (let i = 0; i < nums.length; i++) {
for (let j = arr.length - 1; j >= 0; j--) {
// 后进来的数,都比前面的大,将前面的数全部弹出
if (nums[i] > nums[arr[j]]) {
let a = arr.pop();
}else {
// 将当前的值,压入队列中
break;
}
}
// 存储下标
arr.push(i);
if (flag) {
let a = i - k + 1;
if (arr[0] < a) {
arr.shift();
}
// 不是第一次
ans.push(nums[arr[0]]);
}
// 第一次窗口出现
if ((i + 1) % k == 0 && !flag) {
ans.push(nums[arr[0]]);
flag = true;
}
}
return ans;
};
附录
- 单调队列解法