边工作边刷题: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
            
            
posted @ 2016-04-26 10:21  absolute100  阅读(113)  评论(0编辑  收藏  举报