84. 柱状图中最大的矩形

2021/06/04 leetcode 共 702 字,约 3 分钟

title

problem link

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

img

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

img

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

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

solution

单调栈,求左边和右边第一个小于它的数,常规可以二分查找找这个数,但中间数据没用,可以用栈维护。参考

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        if not heights:
            return 0
        n = len(heights)
        l = [0 for _ in range(n)]
        r = [0 for _ in range(n)]
        stack = []
        for i, h in enumerate(heights):
            while stack and heights[stack[-1]] >= h:
                stack.pop()
            l[i] = stack[-1] if stack else -1
            stack.append(i)
        stack = []
        for i in range(n - 1, -1, -1):
            h = heights[i]
            while stack and heights[stack[-1]] >= h:
                stack.pop()
            r[i] = stack[-1] if stack else n
            stack.append(i)
        print(l, r)
        ans = max(h * (r[i] - l[i] - 1) for i, h in enumerate(heights))
        return ans

Search

    Table of Contents