本人小蒟蒻
哈哈哈 经过两天的苦思冥想终于想清楚了单调栈的本质 特意在此留下一些我的蒟蒻见解
首先 我们要明白单调栈到底是什么
单调栈能够记录下有用的,舍弃无用的,从而对复杂度进行优化操作。
单调栈其实就是后缀最大值/最小值 (在栈中 从一个元素到现在的位置,这个值就是最大值);
例如
最大栈
下标:1 2 3 4 5 6 7 8 9 10 11 12 13
数值:1 4 2 1 4 5 1 2 3 4 1 2 4
1.栈内:1
2.栈内:4
3.栈内:4 2
4.栈内:4 2
5.栈内:4
6.栈内:5
也就是说 1-1 最大值1
2-2 最大值4
3-3 最大值2 2-3最大值4
3-4 最大值2 2-4最大值4
5-5 最大值4 2-5最大值4
6-13 最大值5
悟了,只是格式不怎么方便理解。(最大栈指用来求一个一维数组中每个元素左边的第一个比该元素大的元素)
这里补充一下关于最大栈的操作:首先依次读入一行数据,随后判断该数据是否进入栈:
如果这个待处理数据比栈顶元素小,那么栈顶元素就是这个待处理元素左侧第一个比它大的元素,并且待处理元素可能会成为后面元素的答案,所以待处理元素入栈(这样也就维护了一个从栈底到栈顶单调减小的单调栈);
如果这个待处理元素比栈顶元素大,就意味着栈顶元素将不可能作为待处理元素后面的元素的答案,那么我们就可以弹出栈顶,将待处理元素压入栈。
当然,对于第二种情况,如果弹出栈顶后的新栈顶仍比待处理元素小,那么就继续弹出栈顶,知道操作后的新栈顶比待处理元素大,或者栈被弹空时为止。
不理解
不理解就慢慢理解