js解決滑動窗口最大值(leetcode第239題)

題目

給定一個數組 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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

解析

  1. 使用雙端隊列
  2. window當中存放的是下標
  3. 窗口的第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;
    };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章