stacked_bar_chart单调栈
单调栈题型:怎么识别、怎么讲、怎么练
单调栈的价值在于把大量“向左/向右找第一个更大或更小”压缩成一次扫描。每个元素都在问谁会最先打败它时,单调栈就是最合适的结构。
覆盖题量
25+
推荐起手
根据“谁应该还没找到答案”选择递增栈还是递减栈。
高频误区
只存值不存索引,导致距离和宽度信息丢失。
什么时候该想到这个模式
题目在找下一个更大、更小,或者最近边界元素。
每个元素都像是要往外扫,直到条件被破坏。
答案跟跨度、柱状图边界、等待天数这类信息有关。
下手前的检查清单
根据“谁应该还没找到答案”选择递增栈还是递减栈。
如果后面要算宽度或距离,栈里一定存索引。
先定义一个元素被弹出时代表什么。
主循环结束后,考虑栈里剩余元素该如何处理。
真正适合面试表达的解题步骤
1
先明确栈维护的是哪种“尚未解决”的关系。
2
只要单调性不被破坏,就持续压栈。
3
当前元素一旦能解决前面的元素,就持续弹栈。
4
答案通常在弹栈那一刻被确定。
5
最后处理剩余元素的默认答案或边界。
常见变体
下一个更大 / 更小
最直接的单调栈模式。
边界宽度
为每个元素找到左右边界以计算宽度。
环形扫描
数组逻辑上是环时,需要两倍遍历。
模板预览
Python公开预览
stack = []
for i, value in enumerate(nums):
while stack and nums[stack[-1]] < value:
prev_index = stack.pop()
# value is the next greater for prev_index
stack.append(i)
更像真实刷题路径的推荐题单
这组题不是随机罗列,而是按“先建立识别感,再补关键变体,最后上强度”去排,适合真的拿来做一轮 pattern 复习。
入门建立直觉
#20 Valid Parentheses
判断括号字符串是否合法。
每个右括号都必须匹配最近那个尚未闭合的左括号,而不是任意更早的一个。
入门建立直觉
#155 Min Stack
设计一个能在 O(1) 返回最小值的栈。
每次 push 都要同步记录当前深度对应的最小值。
变体补齐关键状态
#503 Next Greater Element II
在环形数组中找每个元素的下一个更大元素。
第二轮遍历的作用只是帮助第一轮没找到答案的元素完成匹配。
变体补齐关键状态
#739 Daily Temperatures
对于每天,求还要等几天才会升温。
把尚未找到更高温度的下标放进递减栈;当前更高温度会一次性解决它后面所有更小温度。
高频难点压强练习
#84 Largest Rectangle in Histogram
求柱状图中的最大矩形面积。
一个柱子被弹出时,当前下标就是它右侧第一个更小柱子,而新的栈顶就是左侧第一个更小柱子。
高频坑点
warning
只存值不存索引,导致距离和宽度信息丢失。
warning
相等元素时比较符号选错。
warning
环形数组题忘了第二轮遍历。
warning
柱状图题漏掉哨兵处理。
练习顺序建议
1
先做每日温度和下一个更大元素。
2
再刷柱状图最大矩形。
3
然后补环形数组变体。
4
最后再做用边界间接计数的高难题。