学习首页/数组算法/单调队列交互演示 · JavaScript

代码与动画 MONOTONIC DEQUE

单调队列.

维护温度或数值的候选下标,输出每个滑动窗口中的最大值。

时间 O(n)空间 O(k)滑动窗口最大值

原理与执行逻辑

只保留可能成为当前或后续窗口最大值的候选下标。新值若不小于队尾值,它更大且更晚过期,队尾候选便可以移除。

执行步骤

  1. 当前下标右移,先移除队首已经离开窗口的下标。
  2. 从队尾持续移除值不大于当前值的候选。
  3. 将当前下标加入队尾,维持候选值严格递减。
  4. 窗口长度达到 k 后,将队首对应值加入结果。

关键理解

候选下标递增、值递减,队首始终是当前窗口最大值。保存下标才能判断过期;每个元素加入与移除至多各一次。

简短示例

[1, 3, 2]、k = 2 时,3 入队会淘汰 1;随后 2 留在 3 后面,两个窗口最大值都为 3。

代码与执行动画

STEP 0 / 22
单调队列
function windowMaximum(a, k) {  const deque = new Map(), result = [];  let head = 0, tail = 0;  for (let i = 0; i < a.length; i++) {    while (head < tail && deque.get(head) <= i - k) deque.delete(head++);    while (head < tail && a[deque.get(tail - 1)] <= a[i]) deque.delete(--tail);    deque.set(tail++, i);    if (i >= k - 1) result.push(a[deque.get(head)]);  }  return result;}
11 行 · 0 个片段标记
1a[0]3a[1]-1a[2]-3a[3]5a[4]3a[5]6a[6]7a[7]
当前数据正在操作已访问 / 命中标记 / 指针
0

初始化候选队列

上行标出窗口,下行按队首到队尾显示下标:数值。

配置演示数据

应用后重新生成执行过程,可单步观察结果。

实现说明

单调队列的操作规则

队首保存当前窗口最大值的下标。移除过期下标,再从队尾移除不大于新值的候选。代码使用 head 指针并清空废弃槽位,避免 shift 的移动成本。

对应题目与扩展练习

观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。