leetcode84. 柱状图中最大的矩形

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

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

 

 

 

 

 

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

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

示例:

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

当前的数字向两边拓展,遇到比自己大的就接着拓展,小的就停止,然后用自己的高度乘以拓展的宽度,每次都跟新最大面积,时间复杂度为O(N^2),tle

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        n = len(heights)
        l, r, ans = [-1] * n, [n] * n, 0
        for i in range(1, n):
            j = i - 1
            while j >= 0 and heights[j] >= heights[i]:
                j -= 1
            l[i] = j
        for i in range(n - 2, -1, -1):
            j = i + 1
            while j < n and heights[j] >= heights[i]:
                j += 1
            r[i] = j
        for i in range(n):
            ans = max(ans, heights[i] * (r[i] - l[i] - 1))
        return ans

实际上我们内层循环没必要一步一步移动,我们可以直接将j -= 1 改成 j = l[j]j += 1 改成 j = r[j]

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        n=len(heights)
        l,r,ans=[-1]*n,[n]*n,0
        for i in range(1,n):
            j=i-1
            while j>=0 and heights[j]>=heights[i]:
                j=l[j]
            l[i]=j
        for i in range(n-2,-1,-1):
            j=i+1
            while j<n and heights[j]>=heights[i]:
                j=r[j]
            r[i]=j
        for i in range(n):
            ans=max(ans,heights[i]*(r[i]-l[i]-1))
        return ans

AC

如果熟悉单调栈的话,很容易想到

单调栈法:

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        n,heights,st,ans=len(heights),[0]+heights+[0],[],0
        for i in range(n+2):
            while st and heights[st[-1]]>heights[i]:
                ans=max(ans,heights[st.pop(-1)]*(i-st[-1]-1))
            st.append(i)
        return ans
posted @ 2020-05-30 17:29  XXXSANS  阅读(282)  评论(0编辑  收藏  举报