84. Largest Rectangle in Histogram
动态规划的变体
题干:
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
解释:
数组中的每个数代表一个高度,让求最大的面积。
思考:
求不同区间的极值,当然是要用dp来做了,状态转移方程就是:dp[i][j]=min(dp[i][j-1],nums[j]),初始值为dp[i][i]=nums[i], 最后得到更新最大面积即可。但是这个办法时间复杂度是O2,会在最后一个test报超时。进而发现其实很多次的运算都是无意义的,比如当下一个值比当前的最小值大的时候,无需计算上次的值,因为延伸了1所以面积必然增大。引申一下,实际上最大面积一定是在木板高度*当前高度下的最大延伸宽度得到的。那么如何得到两边第一个小于当前柱子的柱子index呢?这里使用单调栈,当柱子B想要进栈的时候,先比较栈顶A和B的高度,如果A大于B,那么A的右边界相当于找到了,A的左边界就是左边第一个比它小的,由于A的左边比它大的已经全部出栈了,因此就是A出栈之后的下一个元素的下标。由此可以得到宽度并计算A对应的最大值。
答案:
from collections import deque
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
if len(heights)==1:
return heights[0]
res=0
stack =deque()
stack.append(0)
i=1
while i<len(heights):
if len(stack)==0 or heights[stack[-1]]<heights[i]:
stack.append(i)
else:
tmpA=stack.pop()
tmpB=stack[-1] if stack else -1
res=max(res,heights[tmpA]*(i-tmpB-1))
i-=1
i+=1
return res
答案补充:
计算宽度的时候一定要仔细思考下标,尤其是这是个柱子,不是个线