leetcode hot100 柱状图中的最大矩形
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
# 可以肯定的是,最终的那个图形,肯定是包含某个矩形的上边的
# 所以我们只要找出每个矩形的,以他自己为上边的大矩形的最大面积即可
# 这个最大面积就是左边比他小的 右边比他小的两个节点决定的
# 先找左边的index
stack = []
lenarr = len(heights)
left = []
right = []
for i in range(lenarr):
while stack and stack[-1][0]>=heights[i]:
stack.pop()
if stack:
left.append(stack[-1])
else:
left.append((-1,-1))
stack.append((heights[i],i))
stack = []
heights = heights[::-1]
for i in range(lenarr):
while stack and stack[-1][0]>=heights[i]:
stack.pop()
if stack:
right.append(stack[-1])
else:
right.append((-1,lenarr))
stack.append((heights[i],lenarr - i-1))
# print(left,right[::-1])
right = right[::-1]
heights = heights[::-1]
maxsize = 0
res = []
for i in range(lenarr):
res.append((right[i][1] - left[i][1]-1)*heights[i])
if maxsize < (right[i][1] - left[i][1]-1)*heights[i]:
maxsize = (right[i][1] - left[i][1]-1)*heights[i]
# print(res)
return maxsize
简单来说就是找到左边的距离他最近的最小的值,右边的距离他最小的值,然后计算当前矩形作为上边的最大矩形面积。
用到了单调栈的模板