其他分享
首页 > 其他分享> > Leetconde(239):利用双向队列解滑动窗口问题

Leetconde(239):利用双向队列解滑动窗口问题

作者:互联网

解题思路

维护以下2个动态数组
1、双向队列temp
它用于保存原数组的下标,队首是当前窗口中的最大值
利用pop方法实现队尾出队,利用splice(0,1)实现队首出队
2、普通数组arr
在每一轮循环最后,将temp的队首推入arr
循环结束后,返回arr

其实我们可以弱化“窗口”这个概念,因为对于队列temp来说,它的长度是不固定的

为了简化表述,将会用队列代指temp

在每一轮循环中(i从0走到nums.length-1)

代码

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    var temp=new Array()
    var arr=new Array()

    //var finished=nums.length-k
    for(let i=0;i<nums.length;i++){
        if(i==0){
            temp.push(i)
        }else{

            if(Math.abs(i-temp[0])>=k){
                temp.splice(0,1)
            }

            while(true){
                if(temp.length===0){
                    break
                }

                let j=temp[temp.length-1]//temp队尾
                if(nums[j]<nums[i]){
                    temp.pop()
                }else{
                    break
                }
            }

            temp.push(i)

        }

        if(i>=k-1){
            arr.push(nums[temp[0]])
        }
    }

    return arr;
};

标签:arr,temp,nums,队列,队首,Leetconde,239,var
来源: https://www.cnblogs.com/baebae996/p/13875148.html