给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
利用暴力查找固定高和宽,时间复杂度都是O()
这里用到一个新的思路,单调栈(单调递增栈):
1.如果新的元素比栈顶元素大,就入栈
2.如果新的元素较小, 那就一直把栈顶元素 弹出来,直到栈顶比新元素小
按照这个规则那么栈内元素会有比较明显的特点:
1. 栈内的元素是递增的
2. 当元素出栈时, 说明这个新元素是出栈元素向后找第一个比其小的元素
3. 当元素出栈后,说明栈顶元素是出栈元素向前找第一个比其小的元素
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
n = len(heights)
# 左右大于等于当前节点高度的数量
left, right = [0] * n, [n] * n
mono_stack = list()
for i in range(n):
# 当新元素小于栈顶元素并且栈不为空,出栈,出栈时统计出栈元素后边比其小的第一个的位置
while mono_stack and heights[mono_stack[-1]] >= heights[i]:
right[mono_stack[-1]] = i
mono_stack.pop()
# 新进入的元素是栈内最大的元素,栈顶是向前找第一个比它小的元素
left[i] = mono_stack[-1] if mono_stack else -1
mono_stack.append(i)
ans = max((right[i] - left[i] - 1) * heights[i] for i in range(n)) if n > 0 else 0
return ans