单调栈简要笔记
以求前面第一个大于它的元素为例。
单调栈本质上是通过保持栈中元素的单调性来维护答案。
假设现在处理到 \(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)\)。

浙公网安备 33010602011771号