双端队列

入门

双端队列把"从哪边进、从哪边出"都交给算法自己决定。

双端队列

会同时演示头插、尾插和双端弹出。

AlgoAnim · 双端队列

待机

速度
待机
// 源代码
1deque<int> dq;
2
3void pushBothEnds(int leftValue, int rightValue) {
4    dq.push_front(leftValue);
5    dq.push_back(rightValue);
6}
7
8void trim() {
9    if (!dq.empty()) dq.pop_front();
10    if (!dq.empty()) dq.pop_back();
11}

复杂度分析

时间 两端操作 O(1)
空间 O(n)
最优 O(1)
最坏 O(1)

算法讲解

双端队列允许在头尾两侧都进行插入和删除,因此比普通队列更灵活。

它在滑动窗口最值、0-1 BFS、回文检查等问题中经常出现。

学习时要明确具体算法为什么要从左边弹还是从右边压,这通常对应状态的淘汰策略。

如果再叠加"保持单调"的规则,就能得到竞赛里非常常见的单调队列技巧。