单调栈
题意:
n个高度不同宽度都是1的矩形并在一起,问最大矩形面积.
思路:
单调栈的经典题.
考虑每个矩形往两边拓展,直到比它矮的就停下来,然后它的高度*最左到最右的宽度就是候选答案.
暴力做的话O(n2),我们可以用单调栈优化到O(n).
栈里存放下标,从栈底到栈顶下标增加,同时对应的高度也是增加.
从左往右扫描,对每个矩形都pop掉大于等于自己高度的下标,然后它能往左拓展的最左下标就是栈顶+1.
因为栈顶<自己,而大于等于自己的都pop掉了.
之后记得把自己push进栈里.
同样地从右往左扫描得到每个矩形往右拓展的最右下标,然后求max即可.
为什么是O(n)的时间复杂度?扫描是O(n)的,而维护栈的复杂度比较抽象.
从整体看,一次扫描里每个矩形最多push一次,pop一次,因此总体是O(n)的,或者说均摊O(1).
总结:
每个矩形往左往右尽量扩展,用单调栈优化.