zoukankan      html  css  js  c++  java
  • 边工作边刷题: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
                
                
    
  • 相关阅读:
    MongoDB Replica Set 选举过程
    转 Warning:MongoDB Replica Sets配置注意事项
    mongodb与内存
    mongodb的监控与性能优化
    php 5.5.1 编译安装过程
    java知识点积累(一)
    java内存及数据区
    static及静态方法
    接口和抽象类
    Java SE自学阶段的笔记整理
  • 原文地址:https://www.cnblogs.com/absolute/p/5677991.html
Copyright © 2011-2022 走看看