1. 程式人生 > >【leetcode】84. Largest Rectangle in Histogram

【leetcode】84. Largest Rectangle in Histogram

class 左右 動態 eight span tco img tro list

題目如下:

技術分享圖片

解題思路:這個問題考的是木桶原理,所以我們的關註點就是找到最短的木板。假設Largest Rectangle 的區間是從heights[i-j],並且heights[k]是其中最短的木板,那麽可以得出heights[k] > heightsv[i-1] (i > 0) 以及 heights[k] > heightsv[j+1] (j < len(heights)-1)。換句話說,我們只需要遍歷一遍heights,計算出以數組中所有元素作為最短木板的Rectangle的面積,取其中最大值即可。對於任意元素heights[k],只需要往左右兩邊分別找到最近的小於自身的元素,那麽這個Rectangle就是heights[k]作為最短木板的最大Rectangle。如何求出左右兩邊最近的小於自身的元素呢?可以用動態規劃。以左邊為例,1.如果heights[k] > heights[k-1] ,那麽顯然dp[k] = k-1;否則,比較heights[k] 與 heights[dp[k-1]],多次循環直到找出比自己小的值即可。

代碼如下:

class Solution(object):
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        if len(heights) ==0 :
            return 0
        dp_left = [0] * len(heights)
        dp_left[0] = -1
        for i in xrange(1,len(dp_left)):
            j 
= i - 1 while heights[i] <= heights[j] and j != -1: j = dp_left[j] dp_left[i] = j #print dp dp_right = [0] * len(heights) dp_right[-1] = len(heights) for i in xrange(len(dp_right)-2,-1,-1): j = i + 1 while
j != len(heights) and heights[i] <= heights[j]: j = dp_right[j] dp_right[i] = j #print dp2 res = 0 for i,v in enumerate(heights): left = dp_left[i] right = dp_right[i] #print left,right,v res = max(res,(right-left-1)*v) return res

【leetcode】84. Largest Rectangle in Histogram