84、柱状图中最大的矩形:
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
res = 0
stack = [0]
heights.insert(0, 0)
heights.append(0)
for i in range(1, len(heights)):
if heights[i] > heights[stack[-1]]:
stack.append(i)
elif heights[i] == heights[stack[-1]]:
stack.pop()
stack.append(i)
else:
while stack and heights[i] < heights[stack[-1]]:
mid = stack.pop()
if stack:
w = i - stack[-1] - 1
res = max(res, heights[mid] * w)
stack.append(i)
return res
和前面的题不同,求的两边第一个比当前遍历元素小(矮)的元素,因此单调栈是单调递减的,仔细体会和前面的不同,挺有意思的,单调栈的题目花样不多,但是很实用