单调栈
定义
单调栈,即一种栈内元素具有单调性的栈。

理解
单调栈内的元素从栈顶到栈底始终保持单调性(单调递增或单调递减),栈顶元素是所有栈内元素的一个最值(单调递增栈的栈顶元素是所有栈内元素的最小值,单调递减栈的栈顶元素是所有栈内元素的最大值)。
为了栈内元素的单调性,单调栈的插入操作涉及两个步骤:
- 将一个元素插入单调栈之前,需要「在保证将该元素插入到栈顶后整个栈满足单调性的前提下」弹出最少的元素。
- 待所有不满足单调性的元素都出栈后,将当前元素入栈。
代码模板
单调递增栈
1 | |
单调递减栈
1 | |
具体应用
每日温度
给定一个数组 (下标从 开始),表示每天的气温。对于每一天的气温 ,输出几天后气温会升高。
例如,如果下一个比 更高的气温是 (,并且 ),那么输出 ,说明 天后气温会升高。
如果对于某一天 ,气温在之后都不会再升高,那么输出 。
对于每天的温度 ,需要求出该天之后第一个比 大的温度 ,并计算得到两者的距离 。
定义一个单调栈,从栈底到栈顶单调非递增。
遍历整个数组 ,如果栈非空,且当前元素大于栈顶元素,如果直接插入当前元素会破坏栈的单调性,那么需要取出栈顶元素。由于当前元素大于栈顶元素,而且一定是第一个大于栈顶元素的数,直接求出下标差就是两者的距离。
然后,将栈顶元素出栈,继续看新的栈顶元素,并依次求出栈顶元素与当前元素的下标差作为答案。
最终,直到当前元素小于等于栈顶元素停止,再将当前元素入栈,这样就可以一直保持栈的单调性,且每个数字和第一个大于它的数的距离也可以算出来。
如果数组遍历完,栈中还有元素,则说明栈中剩余的元素都找不到在它之后第一个比它大的数,答案均为 即可。
对于温度数组 {9, 7, 4, 7, 12, 7},算法运行过程如下:
1 | |









