题目:
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
单调栈
要找到柱状图中的最大矩形面积,可以理解为对于每一个柱子,找到以它的高度为矩形高度的最大宽度,这个宽度由柱子左右两边第一个比它矮的柱子的位置决定。
具体来说:
对于柱子i,其高度为height[i]
向左找到第一个比heights[i]小的柱子的位置left
向右找到第一个比hseights[i]小的柱子的位置right
以heights[i]为高度的最大矩形面积为heights[i]*(right-left-1)
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
stack=[] #初始化一个空栈stack,用于存储柱子的索引,栈中的索引对应的高度是单调递增的
max_area=0 #记录当前找到的最大矩形面积
heights.append(0)#添加一个高度为0的柱子,确保所有的柱子都能被处理
for i ,h in enumerate(heights): #遍历柱子高度列表,i是当前柱子索引,h是当前柱子高度
while stack and h<heights[stack[-1]]: #当栈不为空且当前柱子高度小于栈顶柱子高度时,进入循环(找到了右边界)
height=heights[stack.pop()] #弹出栈顶元素,并获取该柱子的高度
width=i if not stack else i-stack[-1]-1 #如果栈为空,宽度就是当前索引i(从开始到当前位置),宽度是当前索引i减去新的栈顶索引再减1
max_area=max(max_area,height*width)
stack.append(i)
return max_area
时间复杂度:O(n)
空间复杂度:O(n)