主要思路:
- 循环数组
- 维护一个保存index且非递增的双端队列
- 特别注意,如果当前遍历的index-队首>=k表示队首已经超出滑动窗口的范围了
完整代码:
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function(nums, k) {
let stack=[]
let res= []
let len =nums.length
for(let i=0;i<len;i++){
while(stack.at(-1)!=null&&nums[stack.at(-1)]<nums[i]){
stack.pop()//弹出小的元素
}
stack.push(i)//存下标
if(i-stack[0]>=k){
stack.shift()
}
if(i>=k-1){
res.push(nums[stack[0]])
}
}
return res
};