84. 柱状图中最大的矩形
难度:困难
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4]
输出: 4
分析:
我的解决思路是这样的,若heights列表的长度为n=len(heights),那么在柱状图中,勾勒出面积矩形区间的宽度应该是在1---n范围内,遍历高度列表heights按宽度切割成的不同区间,依次求出可以勾勒出来的矩形面积,保存其中的最大值即可。
注意:在切割区间的时候,因为区间有一定的宽度,不要让索引值超过heights列表的索引范围,所以每一宽度的最后一个切割区间,其起始位置是随着宽度的增加而不断向前移动的。
程序如下:
heights=eval(input('pls input heights='))
#s用于存储最大面积
#w用于存储宽度
#m用于存储最大面积的起始位置
#h用于存储最大面积的高度
#初始化它们的值为0
s=0
w=0
m=0
h=0
#外循环变量i用于控制每次取出的宽度
#其范围是1-n,n是heights的长度
#宽度最少取一个柱子,最多可以取n个柱子
#内循环取出的不同区间,循环变量j控制区间的起始位置,这些区间的宽度由外循环变量i设定
n=len(heights)
for i in range(1,n+1):
for j in range(n-i+1):
#取出从j开始宽度为i的区间
x=heights[j:j+i]
#求区间勾勒出的面积
y=min(x)*i
#如果所求面积比之前保存的最大面积还大,则保存新的最大面积
#并记录此最大面积区间的起始位置j到m中以及对应的宽度i到w中和对应高度h
if y>s:
s=y
w=i
m=j
h=min(x)
#循环结束,s中即为要找的最大面积,对应的最大面积区间亦可根据m和w找到
print('最大面积为:',s)
print(f'最大面积的起始位置为{m},结束位置为{m+w-1},对应的高度为{h}')
运行实例1:
pls input heights=[2,1,5,6,2,3]
最大面积为: 10
最大面积的起始位置为2,结束位置为3,对应的高度为5
运行实例2:
pls input heights=[3,5,7,3]
最大面积为: 12
最大面积的起始位置为0,结束位置为3,对应的高度为3
运行实例3:
pls input heights=[5,5,3,3,2,2,6,6,6,4,4,4,2,2,2,2]
最大面积为: 32
最大面积的起始位置为0,结束位置为15,对应的高度为2
总结:所谓“磨刀不误砍柴功”,找到好的算法,问题的解决就会容易很多。