单调栈的优势与应用场景
一、单调栈的核心优势
-
时间复杂度低
单调栈的每个元素最多入栈和出栈一次,因此时间复杂度通常为 O(n)O(n)O(n)。例如,在寻找数组中每个元素的“下一个更大元素”时,单调栈能高效完成遍历和比较操作。 -
空间复杂度可控
栈的存储空间仅与输入规模线性相关,且可通过优化进一步减少空间占用(例如复用原数组)。 -
简化复杂问题
对于需要寻找特定顺序或区间极值的问题,单调栈通过维护单调性将问题分解为局部操作,例如快速定位某个元素左右两侧的边界。
二、常见应用场景
-
寻找“下一个更大/更小元素”
- 问题示例:给定数组 numsnumsnums,为每个元素找到右侧第一个比它大的元素。
- 实现方式:使用单调递减栈。当新元素大于栈顶时,栈顶元素的下一个更大元素即为当前元素,随后弹出栈顶并记录结果。
-
区间最值问题
- 典型问题:滑动窗口最大值(LeetCode 239)。
- 实现方式:使用单调递减队列(类似栈),维护窗口内的最大值候选集,确保队首始终为当前窗口最大值。
-
面积或边界相关计算
- 柱状图中最大矩形(LeetCode 84):通过单调递增栈确定每个柱子左右第一个比它矮的边界,从而计算以该柱子为高度的最大矩形。
- 接雨水(LeetCode 42):通过单调递减栈找到左右边界,计算凹槽区域的储水量。
-
数据压缩与预处理
单调栈可用于将复杂序列转化为单调序列,简化后续处理步骤。例如,在动态规划问题中预处理某些约束条件。
三、与其他数据结构的对比
场景 | 单调栈/队列 | 普通栈/队列 |
---|---|---|
滑动窗口最大值 | 通过单调性维护候选集,O(n)O(n)O(n) | 暴力遍历,O(nk)O(nk)O(nk) |
下一个更大元素 | 一次遍历即可完成,O(n)O(n)O(n) | 嵌套循环,O(n2)O(n^2)O(n2) |