数据结构与算法每日一题——栈(239. 滑动窗口最大值)

69 阅读1分钟

239. 滑动窗口最大值

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function (nums, k) {
    // if (k === 1) return nums;
    // let deQueue = [];
    // let res = [];
    // for (let right = 0; right < nums.length; right++) {
    //     let num = nums[right];
    //     while (deQueue.length && deQueue[deQueue.length - 1] < num) {
    //         deQueue.pop();
    //     }
    //     deQueue.push(nums[right]);

    //     let left = right - k + 1;
    //     if (left >= 0) {
    //         res.push(deQueue[0]);
    //         // 滑动过程中,如果序列中的最大元素即退出窗口,则移除队列头部元素
    //         if (nums[left] === deQueue[0]) {
    //             deQueue.shift();
    //         }
    //     }
    // }
    // 解法二:
    //https://www.bilibili.com/video/BV1tT4y117kj/?spm_id_from=333.337.search-card.all.click&vd_source=5f94d386b0af0c7308b20ba35088d7f8
    const queue = new Array()
    let len= nums.length
    let ans =[]
    for(let i=0;i<len;i++){
        // 做比较保持递减
        while(queue.length && nums[i]>nums[queue[queue.length-1]]) queue.pop()
        queue.push(i)
        //将一直保持k个
        if(i-k ===queue[0]) queue.shift()
        // 返回每个k个中的最大值
        if(i>=k-1) ans.push(nums[queue[0]])
    }
    return ans
};