给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为[2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
解法
参考:https://www.cnblogs.com/lupx/archive/2015/10/20/leetcode-85.html
最优解要么是高的,要么是矮的但是宽的
从左到右遍历到第i个bar,
- 它比栈顶的bar还要高,那么直接入栈,并且以第i个bar的高度为高的矩形目前暂时宽度只有1。
- 它比栈顶的bar要矮,那么我们可以宣告栈顶元素已经完成了它的任务了,因为以它的高度为高的矩形已经被我们完全搜索过了:
- 我们将栈顶出栈,现在我们可以算出来以栈顶元素的高度为高的矩形的宽度了,它肯定是从栈顶前一个元素的那个下标(不包括它)到i的距离(不包括i)
- 如果新栈顶还是比i高,那么还可以继续出栈
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
n = len(heights)
stack = []
ans = 0
for i,h in enumerate(heights):
while len(stack) and h<heights[stack[-1]]:
j = stack.pop()
b = stack[-1]+1 if len(stack) else 0
ans = max(ans, heights[j]*(i-b))
stack.append(i)
while len(stack):
j = stack.pop()
b = stack[-1]+1 if len(stack) else 0
ans = max(ans, heights[j]*(n-b))
return ans