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]

浙公网安备 33010602011771号