您的位置:首页 > 其它

LeetCode-[单调栈]Largest Rectangle in Histogram

2017-09-08 09:32 465 查看
Link

Link

单调栈使用最经典题目。

求最大矩形面积。

N2方法是枚举起点,然后不断枚举终点,在起点固定终点右移过程中记录最短距离即可。

N1方法是使用单调栈,基于的观察是对于一个连续上升的矩形来说,若当前矩形比前一个不小于就放入队列。

因为此时最优解的终点必然可以延展到当前矩形。若当前矩形小于前一个,那前一个有可能是最优解的终点。

现在问题是,如何找到最优解的起点。

此时以 前一个矩形为终点,弹栈时,枚举栈中小于当前的矩形当作高度和起点来计算,大于的都弹栈。

栈中的数据意思是,从栈中比我小的位置开始起始到当前的最小值就是我(若栈为空,则从数组其实到当前)

这些结束后,再对栈中的数据遍历计算一遍即可。

class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
stack=[]
ans=0
hLen=len(heights)
idx=0
while idx<hLen:
if len(stack)==0 or heights[idx]>=heights[stack[-1]]:
stack.append(idx)
idx+=1
else:
# 枚举起点和高度,结束点已经定了是idx-1的位置
# 对于当前的数据,存在栈中的位置之前的数据肯定都是满足大于等于当前数据
t=stack.pop()
if not len(stack):
ans=max(ans,heights[t]*idx)
else:
ans=max(ans,heights[t]*(idx-1-stack[-1]))

if len(stack):
tt=stack[-1]
while len(stack):
t=stack.pop()
if not len(stack):
ans=max(ans,heights[t]*(tt+1))
else:
ans=max(ans,heights[t]*(tt-stack[-1]))
return ans
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: