其实最开始是想写DP的也写出来了,但有一个测试用例全是1,真的恶心,然后就用单调栈
单调栈:如果当前值大于栈顶元素,出栈,直到栈顶元素均大于当前值,入栈。入栈坐标应该是多少?
如果在入栈时栈不空直接就用自己的坐标;
如果入栈时栈空就用刚出栈的栈顶指针坐标
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
就是需要用栈,用dp的话空间真的不够
栈顶保存高度和进去时候的坐标(累计宽度)
:stack[0]heights
:stack[1]start_index
"""
heights.append(0)
ans=0
stack_temp=[[heights[0],0]]
for i in range(1,len(heights)):
temp=[0,i]
while stack_temp and stack_temp[-1][0]>heights[i]:
temp=stack_temp.pop(-1)
ans=max(ans,temp[0]*(i-temp[1]))
if not stack_temp or stack_temp[-1][0]<heights[i]:
stack_temp.append([heights[i],temp[1]])
return ans