【算法】leetcode 84. 柱狀圖中最大的矩形(單調棧)

問題來源

84. 柱狀圖中最大的矩形
給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度爲 1 。

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

以上是柱狀圖的示例,其中每個柱子的寬度爲 1,給定的高度爲 [2,1,5,6,2,3]。

圖中陰影部分爲所能勾勒出的最大矩形面積,其面積爲 10 個單位。

示例:

輸入: [2,1,5,6,2,3]
輸出: 10

大佬解析


代碼


"""
需求:
    給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度爲 1 。求柱狀圖中最大的矩形
    
思想:
    1.暴力破解(二重循環,遍歷以每根柱子爲高的最大矩形面積,取最大者)
    2.單調棧
"""


class Solution:
    def largestRectangleArea(self, heights) -> int:
        # 單調棧
        max_area = 0
        heights = [0] + heights + [0]  # 左右兩端加0是爲了處理邊界情況
        stack = [0]  # 記錄當前棧中柱子下標

        for i in range(1, len(heights)):
            while heights[i] < heights[stack[-1]]:
                height = heights[stack.pop()]
                width = i - stack[-1] - 1
                max_area = max(max_area, height * width)
            stack.append(i)
        return max_area

    def largestRectangleArea1(self, heights) -> int:
        # 暴力解法
        size = len(heights)
        res = 0

        for i in range(size):
            min_height = heights[i]
            for j in range(i, size):
                min_height = min(min_height, heights[j])
                res = max(res, (j - i + 1) * min_height)

        return res

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章