单调栈简要笔记

以求前面第一个大于它的元素为例。

单调栈本质上是通过保持栈中元素的单调性来维护答案。

假设现在处理到 \(i\),考虑栈顶元素 \(w_x\),若 \(w_x \le w_i\),直接弹出 \(x\)

这么做的正确性:

  • \(i < j\)\(w_i \le w_j\),那么 \(w_x \le w_i \le w_j\),本来就该被排掉。
  • \(i < j\)\(w_i > w_j\),显然 \(i\) 是一个比 \(x\) 更优的解(因为距离 \(j\) 更近)。

也就是说,栈里面的元素从栈底到栈顶是单调递减的,且都是合法答案,而栈顶距离 \(i\) 最近,所以栈顶就是答案。

一个数最多被推进栈里面一次,排出一次,因此复杂度为 \(O(n)\)

posted @ 2025-07-12 19:50  邻补角-SSA  阅读(7)  评论(0)    收藏  举报