单调栈
单调栈:顾名思义,单调栈指栈内元素满足单调性的栈结构。单调递增or单调递减。下面以单调递增栈为例进行阐述
单调递增栈:就是栈内元素满足单调递增,假设当前元素为\(x\), 若栈顶元素\(<=x\), 则将\(x\)入栈,否则不断弹出栈顶元素,直至栈顶元素\(<=x\)。
以3,1,4,5,2,7为例,入栈结束后,栈中仅保留了1,2,7,其中3由于比1大被弹出,4,5由于比2大弹出。
对于单调递增栈,有以下结论:
- 若栈顶元素被弹出,则当前元素为其(被弹出的栈顶元素) 右边第一个比它小的数
- 当一个数字被放入单调递增栈,其栈内左边的数是它在原始序列中,左边第一个小于等于它的数
单调栈的根本作用,在于求得每一个数字在原始序列中左/右边第一个大于/小于它自身得数字,并且,对于每一个数字只会入栈一次且最多出栈一次,因此总时间复杂度为\(O(n)\)。
另外需要注意,一次「单调递增栈」的过程,可以求得每个数字左边第一个小于等于它的数,以及右边第一个小于它的数,此处需注意「小于等于」和「小于」的区别。除此之外,「单调递减栈」将上述的「小于」改为「大于」即可成立。
例题1:每日温度