返回全部文章

单调栈:为什么很多“找下一个更大元素”都能统一处理

单调栈第一次接触时常让人觉得有点“技巧化”,但它其实解决的是一类很稳定的问题:

单调栈第一次接触时常让人觉得有点“技巧化”,但它其实解决的是一类很稳定的问题:

当你需要快速找到某个元素左边或右边第一个更大/更小的元素时,如何避免反复回头看。

这类问题为什么适合单调栈

如果你暴力做,通常是:

  • 对每个位置
  • 再往左或往右扫
  • 找到第一个满足条件的位置

这很容易变成 O(n^2)

而单调栈的本质,是在扫描过程中维护一个“还没被处理完的候选集合”。

为什么它叫单调栈

因为栈里维持了一种顺序,例如:

  • 单调递减
  • 单调递增

这个顺序的意义不是形式美观,而是保证:

  • 新元素一来,就能立刻判断哪些旧元素已经没用了

常见题型信号

  • 下一个更大元素
  • 下一个更小元素
  • 柱状图面积
  • 温度变化类问题

只要题目里出现“左边/右边第一个满足某条件的元素”,单调栈就值得优先怀疑。

最容易卡住的地方

不是写栈,而是不知道:

  • 栈里到底存值还是存下标
  • 当前弹栈时,意味着什么关系被确定了

如果把“弹栈的语义”想清楚,很多题都会顺很多。

结论

单调栈不是死记硬背的技巧,而是一种在扫描过程中主动淘汰无效候选的方式。

你真正要学会的是:

什么时候一个旧元素已经不值得再保留。