Skip to content

单调队列/单调栈与生命周期

想了好久总算想明白了,什么时候单调栈什么时候单调队列。

用这个往往都是要维护一个序列的最值的时候,不管这个序列是子序列还是什么的。从生命周期的角度我觉得是最容易理解这种思想的,应该说是生命周期的情况。如果题目中的要求隐含着较老的元素生命周期可能结束,比如滑动窗口,窗口左边的元素可能在某个时刻被消除,生命周期可能结束,因此这种情况适合使用单调队列。像最小栈问题,除非主动的 pop,生命周期永远不会结束,可能就是单调栈。

接下来维护的就是单调性。这种时候往往考虑的是一个最优的问题还有生命周期的问题。在新的进来之前,考虑我这个新的进来,哪些老的可能绝对的没用,绝对没用的直接移除。如果生命周期老的在在未来还有用到,考虑让其留下来。删除的时候,因为先前进来的时候已经删掉了一些不符合的,所以删除当前生命周期结束元素的时候,往往可能就是加一个判断就行了。在批量移除元素的时候,往往不加等于号的情况比较多,不然删一次很多声明周期老的都被一起删掉了。

单调栈和单调队列的时候先想想,题目的解允不允许不连续的。再单调队列中的元素可能是数组中不连续的,比如接雨水允许不连续,两个不连续的中间也可以接雨水,但是最大矩形就不行,不允许不连续的,不连续的不能有最大的矩形。或者说在创造出不间断的时候,队列或者栈里面的的性质就好像这个元素还在的时候iu的情况。