题目描述

单调栈法
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
stack = []
'''
需考虑两种特性情况:
1. 弹栈的时候,栈为空;
2. 遍历完成以后,栈中还有元素
在输入数组的两端加上两个高度为 0 (或者是 0.5,只要比 1 严格小都行)的柱形(哨兵),可以回避上面这两种分类讨论
加入数组左边的柱形由于它一定比输入数组里任何一个元素小,它肯定不会出栈,因此栈一定不会为空;
加入数组右边的柱形也正是由于它一定比输入数组里任何一个元素小,遍历完成时,它会让输入数组里的所有元素出栈(第 1 个哨兵元素除外)。
'''
heights = [0] + heights + [0]
max_area = 0
for i in range(len(heights)):
while stack and heights[i] < heights[stack[-1]]:
tmp = stack.pop()
max_area = max(max_area, (i-stack[-1]-1)*heights[tmp])
stack.append(i)
return max_area