代码与动画 MONOTONIC DEQUE
单调队列.
维护温度或数值的候选下标,输出每个滑动窗口中的最大值。
时间 O(n)空间 O(k)滑动窗口最大值
原理与执行逻辑
只保留可能成为当前或后续窗口最大值的候选下标。新值若不小于队尾值,它更大且更晚过期,队尾候选便可以移除。
执行步骤
- 当前下标右移,先移除队首已经离开窗口的下标。
- 从队尾持续移除值不大于当前值的候选。
- 将当前下标加入队尾,维持候选值严格递减。
- 窗口长度达到 k 后,将队首对应值加入结果。
关键理解
候选下标递增、值递减,队首始终是当前窗口最大值。保存下标才能判断过期;每个元素加入与移除至多各一次。
简短示例
[1, 3, 2]、k = 2 时,3 入队会淘汰 1;随后 2 留在 3 后面,两个窗口最大值都为 3。
代码与执行动画
STEP 0 / 22function 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;}当前数据正在操作已访问 / 命中标记 / 指针
0
初始化候选队列
上行标出窗口,下行按队首到队尾显示下标:数值。
配置演示数据
应用后重新生成执行过程,可单步观察结果。
单调队列的操作规则
队首保存当前窗口最大值的下标。移除过期下标,再从队尾移除不大于新值的候选。代码使用 head 指针并清空废弃槽位,避免 shift 的移动成本。
对应题目与扩展练习
观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。
- 对应题目239. 滑动窗口最大值打开题目
直接对应递减双端队列,移除过期下标并读取队首。