題目
給定一個數組 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;
};