单调栈:为什么很多“找下一个更大元素”都能统一处理
单调栈第一次接触时常让人觉得有点“技巧化”,但它其实解决的是一类很稳定的问题:
单调栈第一次接触时常让人觉得有点“技巧化”,但它其实解决的是一类很稳定的问题:
当你需要快速找到某个元素左边或右边第一个更大/更小的元素时,如何避免反复回头看。
这类问题为什么适合单调栈
如果你暴力做,通常是:
- 对每个位置
- 再往左或往右扫
- 找到第一个满足条件的位置
这很容易变成 O(n^2)。
而单调栈的本质,是在扫描过程中维护一个“还没被处理完的候选集合”。
为什么它叫单调栈
因为栈里维持了一种顺序,例如:
- 单调递减
- 单调递增
这个顺序的意义不是形式美观,而是保证:
- 新元素一来,就能立刻判断哪些旧元素已经没用了
常见题型信号
- 下一个更大元素
- 下一个更小元素
- 柱状图面积
- 温度变化类问题
只要题目里出现“左边/右边第一个满足某条件的元素”,单调栈就值得优先怀疑。
最容易卡住的地方
不是写栈,而是不知道:
- 栈里到底存值还是存下标
- 当前弹栈时,意味着什么关系被确定了
如果把“弹栈的语义”想清楚,很多题都会顺很多。
结论
单调栈不是死记硬背的技巧,而是一种在扫描过程中主动淘汰无效候选的方式。
你真正要学会的是:
什么时候一个旧元素已经不值得再保留。