Loading

Leetcode - 84. 柱状图中最大的矩形

给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1
求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

(未完成)解1 2021/9/11 O(?)

from collections import defaultdict

def largestRectangleArea(heights: list) -> int:
    # 如果挨个遍历过去,在某个位置,向两边延展,O(n^2)的算法,
    # 一定是超时的,这题的规模很大
    # len∈[1,10^5]
    # height∈[0,10^4]
    # 用dict将所有的数的位置存下来,确实可以减少规模,
    # 比如,0位置的2,只需要找左右<2的数的位置(离得最近的那一个)
    # 再比如2位置的5,就找4,3,2,1,0
    # 这样规模确实会小一点,试试超不超时
    # list存下标
    d=defaultdict(list)
    len=heights.__len__()
    if len==1: return heights[0]
    for i,v in enumerate(heights):
        d[v].append(i)
    #print(d)
    res=0
    for i,v in enumerate(heights):
        res=max(res,v)
        # 找比<v的,左右离i最近的2个点
        l=r=i
        for x in range(0,v):
            # 调试总是哪里有问题,这里的l、r得保存两份,一份是随着v的增加而收缩的一份,
            # 另一份是当前的x,它的左右,因为后面res更新是计算的x,不能用外面的l、r
            # 而lx和rx,要在[l,r]的范围内竟可能宽
            lx=rx=i
            for idx in d[x]:
                if idx<i:
                    if l==i or i-idx<i-l:
                        l=idx
                    if lx in range(l,r+1):
                        # [TODO] 感冒状态奇差
                        res=max(res,x*(r-l+1))
                if idx>i:
                    if r==i or idx-i<r-i:
                        r=idx
                        res=max(res,x*(r-l+1))
    return res

if __name__ == '__main__':
    # 10
    heights = [2, 1, 5, 6, 2, 3]
    print(largestRectangleArea(heights))
    # 4
    heights = [2, 4]
posted @ 2021-09-11 09:33  wwcg2235  阅读(52)  评论(0)    收藏  举报