239.滑动窗口最大值

87 阅读1分钟

考察的数据结构-队列

题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

JavaScript 实现

/**
 * 考察队列
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    // 存储 k 个数字的滑动窗口队列
    const queue = []
    // 存储滑动窗口的最大值数组
    const res = []

    // 遍历先找出前k个窗口要存储的值索引
    for (let i = 0; i < k; i++) {
        // 如果队列中的尾值小于当前即将插入的值,就删除掉
        while(queue.length && nums[queue[queue.length - 1]] < nums[i]) {
            queue.pop()
        }
        // 从队尾插入元素索引
        queue.push(i)
    }
    // 存储窗口最大值的第一项
    res[0] = [nums[queue[0]]]
    // 每次移动一位开始遍历
    for (let i = k ; i < nums.length; i++) {
        // 当前值比队列的尾值大就删除
        while(queue.length && nums[i] >= nums[queue[queue.length - 1]] ) {
            queue.pop()
        }
        // 当前值小,就直接在尾部添加
        queue.push(i)
        // 从队首开始删除不在滑动窗口内的
        while(queue[0] <= i - k) {
            queue.shift()
        }
        // 添加最大值
        res.push(nums[queue[0]])
    }
    return res;
};

实现过程

  1. 滑动窗口队列中对首保持最大值,每次从队尾添加,比它小就入栈(push),比它大就从队尾遍历删除(pop)
  2. 注意滑动窗口要保持个数不能超过指定的 k 项