题目链接
题目(困难)
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。
例如,如果输入数组 nums = [1,3,-1,-3,5,3,6,7] 和滑动窗口的大小 k = 3,那么一共存在 6 个滑动窗口,它们的最大值分别为 [3,3,5,5,6,7]。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
示例 2:
输入:nums = [1], k = 1
输出:[1]
提示:
- 1 <= nums.length <= 10^5
- -10^4 <= nums[i] <= 10^4
- 1 <= k <= nums.length
- 注意:本题与 239 题相同:leetcode-cn.com/problems/sl…
题解
单调栈(减)
复杂度分析:
- 时间复杂度为:O(N)
- 空间复杂度为:O(N)
var maxSlidingWindow = function(nums, k) {
let res = [];
let stack = []; // 存放下标
for (let i = 0; i < nums.length; i++) {
if (i - stack[0] >= k) { //在滑动窗口之外的直接从队头删掉
stack.shift();
}
while (stack.length > 0 && nums[stack[stack.length - 1]] < nums[i]) {
stack.pop(); // 栈顶元素小于当前元素,栈顶元素出栈, 维持栈底元素最大
}
stack.push(i); // 存储索引
if (i + 1 >= k) { // 开始存结果
res.push(nums[stack[0]]); // 获取栈底元素
}
}
return res;
};