1. 程式人生 > >(python stack) leetcode84 Largest Rectangle in Histogram

(python stack) leetcode84 Largest Rectangle in Histogram

這道題使用的知識點是:棧

從左到右,如果當前對應的小矩形高度大於棧頂對應小矩形高度,進棧,移動到下一個小矩形,,,,,,,,,

否則棧頂元素出棧,再次比較此時棧頂元素和當前對應的小矩形高度,如果前者還是大於後者,繼續出棧,直到小於等於為止

依次計算上面一次連續出棧的小矩形組成的矩形面積,最大面積依此不斷更新

最後返回最大面積

注意:這裡每次進棧的是小矩形對應的索引而不是其高度,同時可以看到stack中索引對應的高度始終是遞增的

下面就以[2,1,5,6,3,2]為例看一下該演算法過程:

設stack為棧,i為當前小矩形的索引用紅色表示,索引所對應的小矩形高度用黃色表示,最大面積用result表示

首先在待求序列末尾加一個0變為[2,1,5,6,3,2,0]

當i=0時:

           進棧,stack=[0]

當i=1時:

          因為heights[1]=1<heights[0]=2 出棧,棧為空了,1進棧,計算出棧小矩形的面積result = 2,

當i=2時:

        此時stack = [1]  因為heights[2]=5>heights[1]=進棧

當i=3時:          

        同理進棧

當i=4時:

       此時stack = [1,2,3]  因為heights[4]=3<heights[3

]=出棧

此時stack = [1,2]  因為heights[4]=3<heights[2]=出棧

       此時stack = [1]  因為heights[4]=3>heights[1]=,4 進棧

上面這一系列出棧的索引有23,計算這兩個索引對應的矩形組成的面積即高度是5和6這兩個矩形,

第一次出棧時面積是6,第二次出棧時,此時兩個組合面積是10

更新result為10

當i=5時:

      此時stack = [1,4因為heights[5]=2<heights[4]=出棧

此時stack = [1]    因為heights[5

]=2>heights[1]=1 ,5進棧

上面這一系列出棧的索引有4,計算這個索引對應的矩形組成的面積即高度是3這個矩形,面積是3

更新result,最大值還應該是10

當i=6時:

         此時stack = [1,5因為heights[6]=0<heights[5]=出棧

          此時stack = [1]    因為heights[6]=0<heights[1]=1 ,出棧

         此時棧為空,6進棧

第一次出棧時面積是3,第二次出棧時組合是5

更新result,最大值還應該是10

結束。。。。。。。。。。。。。。。。。。

給一下python程式碼:

class Solution:
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
      
        heights.append(0)
        stack = []
        i = 0
        result = 0
        while i<len(heights):
            if not stack or heights[stack[-1]]<heights[i]:
                stack.append(i)
                i+=1
            else:
                num = stack.pop(-1)
                result = max(result,heights[num]*(i-stack[-1]-1 if stack else i))
        return result

注意這裡的

i-stack[-1]-1

就是當前出棧的所有矩陣寬度之和(間隔),說白了就是我們要計算面積的寬,當stack為空的時候,也就是全出棧啦,此時寬度就是i