239. Sliding Window Maximum

25 年 10 月 14 日 星期二
228 字
2 分钟
Screenshot 2025-10-14 at 9.55.40 pm
js
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function (nums, k) {
  // 时间复杂度是O(n^2) 考虑max的复杂度
  const n = nums.length
  const ans = []
  const window = nums.slice(0, k)
  for (let right = k; right < n + 1; right++) {
    ans.push(Math.max(...window))
    window.push(nums[right])
    window.splice(0, 1)
  }
  return ans
}
js
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function (nums, k) {
  // O(n) 单调队列
  const ans = []
  const q = new Deque() // datastructures-js/deque
  for (let i = 0; i < nums.length; i++) {
    // 1. 右入
    while (!q.isEmpty() && nums[q.back()] < nums[i]) {
      q.popBack() // 维护 q 的单调性
    }
    q.pushBack(i) // 注意保存的是下标,这样下面可以判断队首是否离开窗口

    // 2.左出
    const left = i - k + 1
    if (q.front() < left) {
      q.popFront()
    }

    // 3. 在窗口左端点处记录答案
    if (left >= 0) {
      // 由于队首到队尾单调递减,所以窗口最大值就在队首
      ans.push(nums[q.front()])
    }
  }

  return ans
}

文章标题:239. Sliding Window Maximum

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/239_sliding_window_maximum[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。