力扣题库第84题“柱状图中最大的矩形”的分析与解决

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

总结:所谓“磨刀不误砍柴功”,找到好的算法,问题的解决就会容易很多。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值