题目定位
栈的作用是帮每根柱子找到左右两边第一个更小的边界,而这正是计算它能扩展到多宽所需的信息。
关键观察
一个柱子被弹出时,当前下标就是它右侧第一个更小柱子,而新的栈顶就是左侧第一个更小柱子。
目标复杂度
O(n) / O(n)
这题的解法思路怎么拆
1
栈的作用是帮每根柱子找到左右两边第一个更小的边界,而这正是计算它能扩展到多宽所需的信息。
2
一个柱子被弹出时,当前下标就是它右侧第一个更小柱子,而新的栈顶就是左侧第一个更小柱子。
3
先明确栈维护的是哪种“尚未解决”的关系。
4
只要单调性不被破坏,就持续压栈。
参考实现
Python# Generic pattern template
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)
常见坑点
warning
忘了用哨兵处理,导致尾部栈清理不完整。
warning
只看高度,不用索引追踪边界。
高频追问
在头尾加 0 哨兵为什么能简化代码?
为什么宽度要基于弹栈后的新栈顶来算?
继续刷相关题
先把 单调栈 这个模式刷成体系,再去做更难变体。