Skip to content

单调栈

Monotonic stack

通过弹出破坏单调性的元素,在线性总时间内维护尚未被更优后继支配的候选位置。

条目类型
原则

形式陈述

扫描序列时维护索引栈,使对应值单调。加入新元素前,反复弹出不再可能成为后续答案的栈顶;每个元素至多入栈一次、出栈一次,因此总时间 O(n)。 具体严格/非严格比较决定处理相等元素的规则,必须与“最近更大/更小”的定义一致。

直觉

单调栈只保留仍可能被未来元素首次击败、成为未来答案的候选,并让其键值按某方向单调。新元素到来时,所有被它支配且以后不可能更优的栈顶会一次性永久弹出;每个元素最多入栈、出栈各一次,所以看似嵌套的循环总成本线性。关键是明确相等元素的处理,否则“最近严格大于”和“最近大于等于”会混淆。

单调栈的连续弹出与最近更小元素
例子与边界

可在线性时间求每个位置左/右侧最近更小元素、柱状图最大矩形。相等元素若处理不一致,会导致重复边界或错误区间。

序列 [2,1,4,3] 求右侧第一个更大元素:扫描到 4 时依次弹出 1,2,它们答案均为 43 入栈后至末尾无更大者。直方图最大矩形中,栈保存递增高度及其最早可延伸位置,遇到更矮柱时结算被弹柱的最大宽度。

单调栈只适合答案由邻近支配关系决定的问题,不能替代一般范围最大查询。重复值时使用 < 还是 <= 会影响边界归属;哨兵可统一清空栈,但其值和下标必须不污染真实答案。

推论与应用

它是摊还分析的简洁范例,并连接 Cartesian tree、区间贡献计数和凸包式候选淘汰。

提供后进先出候选集,全序 定义支配,摊还分析 证明 O(n)。下一个更大元素、股票跨度、笛卡尔树和直方图面积都共享这一“弹出已失去未来价值元素”的模式。

单调栈扫描数组时维护“栈内下标递增、对应值单调,且尚未找到右侧更小项”的候选不变量。相同弹栈轨迹可在线性时间构造Cartesian Tree:最后弹出链成为新节点左子。该树再把RMQ转成 LCA。单调栈本身回答一次静态邻近关系,不支持数组更新;Cartesian tree 与 RMQ 也需固定并列规则。

参考资料
关系图谱4 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系

使用的工具

实现的抽象