【数据结构】单调队列与单调栈
单调队列和单调栈利用队列和栈两个基本的数据结构维护一个单调序列,用来解决具有单调性的问题
单调队列
-
维护一个队列,使得队列里的元素具有单调性
-
很好想,看新来的元素是否能插入队尾(即插入后是否还符合单调性质),若不行就弹出队尾元素并继续上述判断,直到可以插入队尾
-
滑动窗口:设定这个队列维护的长度不超过 (窗口长度)
-
每次插入了元素之后,检查队首元素是否还在窗口范围内,不在则出队
-
特别注意,这里不是队列的长度而是队列中元素在原来线性数组中的元素距离。由元素入队的顺序可知,只要检查队首与队尾元素的距离即可
-
-
应用:任意固定长度区间的最值,时间复杂度
1 | //以单调最小值为例 |
单调栈
-
维护一个具有单调性的栈,原理与单调队列基本相同
-
应用:找向右/左沿伸一直小的位置(换种说法,某个元素作为最值的区间范围)
1 | for (int i = 1; i <= n; i++) |
题目
解决题目的关键是找单调的特征,然后应用以上两种数据结构。两种结构有时候都可以用,有时不行,要具体分析题目中的单调性质。
单调队列
POJ2823/P3865 模板
洛谷P2251 滑动窗口
单调栈
Uva1619 单调队列写的,求最小值覆盖区间
洛谷P4697
洛谷P6801
洛谷P5923 没看懂。。。