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;
    };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章