1. 程式人生 > 實用技巧 >leetcode(34)-柱狀圖中的最大矩陣

leetcode(34)-柱狀圖中的最大矩陣

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

https://leetcode-cn.com/problems/largest-rectangle-in-histogram/

自己的方法是優化一半的方法,使用單調棧更好

class Solution:
    def largestRectangleArea(self, heights) -> int:
        ln = len(heights)
        heights = heights[::-1]
        begins_l = [i for i in range(ln)]
        begins_r = [i for i in range(ln)]
        if ln ==0: return 0
        max_area = max(heights)
        for i,height in enumerate(heights):
            if height*ln<=max_area:
                continue
            if i > 0 and heights[i-1]>=height:
                begin_l = begins_l[i-1]
                begin_r = begins_r[i-1]
            else:
                begin_l = i
                begin_r = i
            while begin_l>0:
                if height<=heights[begin_l-1]:
                    begin_l-=1
                else:
                    break
            begins_l[i] = begin_l
            if (ln-begin_l)*height<=max_area:
                continue
            while begin_r<ln-1:
                if height<=heights[begin_r+1]:
                    begin_r+=1
                else:
                    break
            begins_r[i] = begin_r
            #print(begin_r,begin_l,max_area)
            max_area = max(max_area, (begin_r-begin_l+1)*height)
        return max_area