给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 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
var maxSlidingWindow = function (nums, k) {
const deque = [];// 保存最大值及最大值后面的索引
const result = []
for (let i = 0; i < nums.length; i++) {
// 删除小于当前值的数组元素
while(nums[deque[deque.length-1]]<nums[i]){
deque.pop();
}
deque.push(i);// 保存索引
// 删除超过窗口的部分
if(deque[0]<=i-k){
deque.shift()
}
// 索引从k-1开始的值就要考虑最大追
if(i>=k-1){
result.push(nums[deque[0]])
}
}
return result
}