双端队列(Deque)要点速记:
- 定义:两端都能插入/删除的队列。常用实现:ArrayDeque。
- 常用操作(以 Deque<Integer> q = new ArrayDeque<>();):
- 头部:q.addFirst(x) / q.removeFirst() / q.peekFirst()
- 尾部:q.addLast(x) / q.removeLast() / q.peekLast()
ArrayDeque,操作有:addLast/removeLast(尾部),addFirst/removeFirst(头部),peekFirst/peekLast 查看头尾元素但不移除。
- 用索引存储而非值:便于判断过期(是否滑出窗口)。
- 滑动窗口最大值的单调队列套路:
-
先弹掉队头过期索引(peekFirst() <= i - k)
-
再弹掉队尾"劣势"索引(对应值 ≤ 当前值),保证值单调递减
-
把当前索引加到队尾
-
窗口形成后,队头即当前窗口最大值
- 单调性的意义:队头始终是最大值;队尾只保留可能成为未来最大值的候选,时间复杂度 O(n),每个索引最多入队出队一次。