单调栈&单调队列

Posted wizarderror

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单调栈&单调队列相关的知识,希望对你有一定的参考价值。

最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了。于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用了容器内元素单调的不同特性,用来加速处理不同的问题。

单调栈解决的是以某个值为最小(最大)值的最大区间,维护的是左右两边第一个比当前位大或者小的数

单调队列解决的是区间最小(最大)值,维护的是区间内的最值

 

举个栗子,a[i] = 1,6,3,5,1,2,4

如果容器内数字是单调递减的,最后得到的容器为 (6, 2),(5, 4) ,(4, 7)

我们来看下,此时容器给我们反馈的信息是什么

(1)4左边第一个比它大的值是5

(2)1~7间的最大值是6,3~7间的最大值是5,5~7间的最大值是7

这两条都是容器扫描完a[]最后一个元素后得出来的结论,只不过第一条用于求解以某个值为最小(最大)值的最大区间,第二条用于求解区间最小(最大)值,由于有时候区间的长度要做限制,因此需要能在两端进行操作的容器,故用双向队列deque,另外一个为了方便起见就用栈

ps:建议做过适量的题目后再来体会这番话,不然很容易懵

以上是关于单调栈&单调队列的主要内容,如果未能解决你的问题,请参考以下文章

单调队列&单调栈归纳

单调栈 & 单调队列

7.14 单调栈 单调队列 +dp优化

单调栈&单调队列入门

单调栈&单调队列入门

单调队列单调栈优先队列模板