题意:
对于一个数组中每一个数来说,找到其左面第一个小于该点的值。
很容易想到是单调栈,可是为什么用单调栈呢?
证明:
我们对[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。
抽象完还是单调的,且为队列,是双向更新的。
最小值分析完了,最大值也就同理了。
973

被折叠的 条评论
为什么被折叠?



