单调栈(Monotonic Stack)¶
单调栈是一种特殊的栈结构,栈内元素始终保持单调递增或递减,常用于解决“下一个更大/更小元素”、“区间最值”、“直方图最大矩形”等问题。
其本质是通过局部有序性,求得相邻的更大/更小数。
递增 vs 递减栈的选择¶
在单调栈中,插入新元素时会不断弹出"挡路"的栈顶,直到新元素与栈内的更大或更小元素相邻。以身高队列为例:
- 找下一个更高的人(递减栈):栈为
[180, 170, 160](底 → 顶),插入 175 时,依次弹出 160、170(均矮于 175),175 停在 180 旁。因为插入值 > 被弹出值,把挡路的人挤走,所以插入值就是被弹出值的下一个更大的值。 - 找下一个更矮的人(递增栈):栈为
[160, 170, 180](底 → 顶),插入 175 时,弹出 180(高于 175),175 停在 170 旁。因为插入值 < 被弹出值,把挡路的人挤走,所以插入值就是被弹出值的下一个更小的值。
适用场景¶
- 需要在 \(O(n)\) 时间内找到每个元素左/右侧第一个比它大(小)的元素
- 解决区间最值、滑动窗口最值、直方图最大矩形等问题
- 常见于数组、序列、温度、股票等题型
模板代码¶
递减栈,找下一个更大元素
- 递增栈(找下一个更小元素)只需把
>换成<
常见题型¶
- 739. Daily Temperatures(下一个更高温度)
- 496. Next Greater Element I
- 503. Next Greater Element II
- 84. Largest Rectangle in Histogram
- 42. Trapping Rain Water
技巧与注意事项¶
- 栈内通常存下标,便于回溯和计算距离
- 处理“循环数组”时可遍历两遍或用取模技巧
- 递增/递减栈的选择取决于题目需求(更大/更小)
- 画图模拟栈的变化有助于理解
相关模式¶
- 单调队列(Monotonic Queue):用于滑动窗口最值
- 双指针、前缀和等可与单调栈结合
经典题目¶
- 739. 每日温度 (Daily Temperatures)
- 84. 柱状图中最大的矩形 (Largest Rectangle in Histogram)
- 42. 接雨水 (Trapping Rain Water)
- 496. 下一个更大元素 I (Next Greater Element I)
- 503. 下一个更大元素 II (Next Greater Element II)
- 85. 最大矩形 (Maximal Rectangle)
- 907. 子数组的最小值之和 (Sum of Subarray Minimums)
- 901. 股票价格跨度 (Online Stock Span)
- 1019. 链表中的下一个更大节点 (Next Greater Node In Linked List)
- 1944. 队列中可以看到的人数 (Number of Visible People in a Queue)
- 2289. 使数组按非递减顺序排列 (Steps to Make Array Non-decreasing)
- 20. 有效的括号 (Valid Parentheses)