单调栈&单调队列

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

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

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

举个栗子,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:建议做过适量的题目后再来体会这番话,不然很容易懵

猜你喜欢

转载自www.cnblogs.com/wizarderror/p/11251610.html