边工作边刷题:70天一遍leetcode: day 23-3
Largest Rectangle in Histogram
这题就是背吧,实际考的概率比较小,考的时候千万别装逼,直说自己见过。
如何背?
- 画面感要强
- 先递增入栈 => 一个低的卡在那,先出栈作为高度,然后栈头作为left => 卡在那的知道又递增了再入栈
- 最后以n做右边界重复上面低的卡在那的逻辑
EDIT: 5/4/16
更好的方法是左右设定一个边界,这样不用单独处理corner case,在循环内搞定。左边界加在stack里,用(index=-1,h=-1),右边界在高度数组里为-1。这样当所有高度检查过,最后高度一定小于栈内,从而会出栈。而在pop栈内高度后,左边界总是小于当前,所以不会出栈。
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
stk = []
area = 0
n = len(heights)
for i in range(n):
if not stk or heights[i]>=stk[-1][0]:
stk.append((heights[i],i))
else:
while stk and stk[-1][0]>=heights[i]:
h = stk.pop()[0]
if not stk:
left = -1
else:
left = stk[-1][1]
if area<(i-left-1)*h:
area=(i-left-1)*h
stk.append((heights[i],i))
while stk:
h = stk.pop()[0]
if not stk:
left = -1
else:
left = stk[-1][1]
if area<(n-left-1)*h:
area=(n-left-1)*h
return area