拿到这个问题很容易想到,对于每一个柱形图,只要向左向右去遍历,然后找到左边第一个小于他的点和右边第一个小于他的点,就可以得到宽度,然后再乘上它的高,就可以得到当前的矩形面积。从左到右依次遍历并且更新结果,最后就可以求得最大的矩形面积。
容易得到,这个解法的时间复杂度为O(n^2),那么怎么优化呢,首先要考虑,从左到右的遍历是免不了的,那么对于每一个点,求解它左右的第一个小于它的元素,这个点是不是可以优化呢。所以这里就用到了单调栈,我们可以花费一点空间,用一个栈来维护一组下标,对于栈中的每一个下标所对应的元素,它的左边第一个比他小的元素的下标就是栈中的前一个下标,有了这样的思路,就容易解决问题了。
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
stack = []
maxarea = 0
for i in range(len(heights)):
while stack and heights[i] <= heights[stack[-1]]:
peek = stack.pop()