题意:
对于一个数组中每一个数来说,找到其左面第一个小于该点的值。
很容易想到是单调栈,可是为什么用单调栈呢?
证明:
我们对[a b] c {d0, d1, d2 ...}
来说,已知a < b & b > c
,对于c后面数字
进行分析。
c后数字
如果大于c
,有可能答案是c
,但答案不可能是b
。
那么对于c后的数字
来说b
是没必要存在的,可以由c
来代替。
对于{}
也就是待分析数字前,应该是单调递增的, 且可支持单侧(挨着{}
的方向)动态更新递增数组,即把b
用c
代替。
抽象完模型后为单调栈。
题意:
更新滑动区间
的最值,即[]
为一个数组,内部有n个数字,求[1 ~ k], [2 ~ k + 1], [3 ~ k + 2]...
的最值。
这个题和上面的题类似,由于是更新区间的最值,首先想到的是队列,出一个值然后加入一个值。
可是感觉太麻烦了,对于区间内部来说找到最小值,和次小值。
和下一个区间相比出去的值和进入的值去更新最小值和次小值,如果出值等于最小值,则由次小值更新最小值,可是次小值由谁来更新呢,显然是行不通的。
还是回到队列,和上题一样的思路。我们来看更新最小值。
对于[a b] c {d0, d1, d2 ...}
来说,已知a < b & b > c
,对于包含b和c的区间
进行分析。
有可能答案是c
,但答案不可能是b
。
抽象完还是单调的,且为队列,是双向更新的。
最小值分析完了,最大值也就同理了。