leetcode 84. 柱状图中最大的矩形

暴力中央拓展法
每次遍历时从中心向两边进行扩展
对于每一个i
寻找它左侧比它更小的数值,并记录其的索引
寻找其右侧比它更小的数值,并记录其索引
这样就能保证矩形左侧达到最大的同时右侧也达到最大
最后计算出两个索引的差-1就是矩形的宽度
对于每一个i,其能形成的矩形最大的高度就是i

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        n = len(heights)
        left = [-1] * n
        right = [n] * n
        ans = 0

        for i in range(1, n):
            j = i - 1
            while j >= 0 and heights[i] <= heights[j]:
                j = left[j]
            left[i] = j

        for i in range(n - 2, -1, -1):
            j = i + 1
            while j < n and heights[j] >= heights[i]:
                j = right[j]
            right[i] = j
        
        for i in range(n):
            ans = max(ans, heights[i] * (right[i] - left[i] - 1))
        
        return ans

你可能感兴趣的:(python,leetcode,leetcode,算法,python)