给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
解题思路:看到题目的第一个想法就是对数组中的每个数据分别往左和往右遍历分别找到第一个小于当前高度的位置,然后计算面积最后返回最大面积;这样做算法复杂度为O()会导致超时。经过进一步的思考,发现对于数组中的每个柱子只需要计算以它为高的面积,然后找到最大面积就可以了,那么我们可以使用一个栈记录下每个柱子的高度和它到左边最远的高度不小于它的index,当遍历的时候只需要比较当前柱子高度和栈中柱子的高度,保证栈内的元素是单调递增的(从栈底向上)。AC代码如下:
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
heights = heights + [0]
stack = []
result = 0
for index, value in enumerate(heights):
flag = 0
if not stack:
stack.append((value, index))
continue
while stack and value < stack[len(stack) - 1][0]:
c_value, c_index = stack.pop()
result = max(result, c_value * (index - c_index))
flag = 1
if flag:
stack.append((value, c_index))
else:
stack.append((value, index))
return result