题目
给定一个数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析
- 使用双端队列
- window当中存放的是下标
- 窗口的第0位永远存放的是最大值的下标
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function(nums, k) {
//加上判断,逼格增加,显示出你的代码风格严谨认真
if(!Array.isArray(nums)||nums.length<k){
return [];
}
//定义返回值和窗口
let res=[],window=[];
for(let i=0;i<nums.length;i++){
//判断当前最大值得下标是否超出窗口大小,如果超出则删除第一个值
if(window[0]<=i-k){
window.shift();
}
//判断将要插入的元素是否比窗口的最后一个元素值大,如果大则删除窗口最后一个元素,继续循环
while(window && nums[window[window.length-1]]<nums[i]){
window.pop();
}
window.push(i);
//将窗口的第一个元素放置到返回结果集
if(i>=k-1){
res.push(nums[window[0]]);
}
}
return res;
};