(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]=1 進棧
當i=3時:
同理進棧
當i=4時:
此時stack = [1,2,3] 因為heights[4]=3<heights[3
此時stack = [1,2] 因為heights[4]=3<heights[2]=5 出棧
此時stack = [1] 因為heights[4]=3>heights[1]=1 ,4 進棧
上面這一系列出棧的索引有2和3,計算這兩個索引對應的矩形組成的面積即高度是5和6這兩個矩形,
第一次出棧時面積是6,第二次出棧時,此時兩個組合面積是10
更新result為10
當i=5時:
此時stack = [1,4] 因為heights[5]=2<heights[4]=3 出棧
此時stack = [1] 因為heights[5
上面這一系列出棧的索引有4,計算這個索引對應的矩形組成的面積即高度是3這個矩形,面積是3
更新result,最大值還應該是10
當i=6時:
此時stack = [1,5] 因為heights[6]=0<heights[5]=3 出棧
此時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