84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
解题思路:
本题使用单调递减单调栈,判断条件为如果遍历数比栈顶数字大或等于则加入栈,小于则触发运算条件,本题的逻辑在于对于每个数,寻找其左右第一个比它小的数作为边界,当前矩形面积为该数为高乘以左右边界长度,操作步骤如下:
- 如果heights[i]大于等于heights[stack[-1],stack.append(i)
- heights两边加0,应对特殊情况如[2, 4, 6, 8] 或 [8, 6, 4, 2]
- 如果heights[i]小于heights[stack[-1]],h = satck.pop(), width = i - stack[-1] - 1
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
heights.insert(0, 0)
heights.append(0)
res = 0
stack = []
stack.append(0)
for i in range(1, len(heights)):
if heights[i]>=heights[stack[-1]]:
stack.append(i)
else:
while stack and heights[i]<heights[stack[-1]]:
h = heights[stack.pop()]
if stack:
width = i - stack[-1] - 1
area = h*width
res = max(res,area)
stack.append(i)
return res