【华为OD机试Python】双指针问题之太阳能板最大面积

 双指针问题是机考常考题型之一。它常用于解决有序数组问题。在这道题中,双指针成功的解决无序数组的最值问题。


题目表述

给航天器一侧安装长方形或正方形的太阳能板,需要先安装两个支柱,然后再在支柱的中间部分固定太阳能板。航天器不同支柱的长度不同,太阳能板的面积受限于最短一侧的那根支柱长度。
现提供一组整型数组的支柱高度数据(支柱高度随机,不一定是有序的),每根支柱之间的距离是1。
计算如何选择两根支柱可以使太阳能板的面积最大。

输入

10,9,8,7,6,5,4,3,2,1
高度之间由英文逗号隔开

输出

25
长度为10和5的两根支柱为太阳能板最大面积所需支柱

示例1

输入

1,9,3,4,5,6,8,2

输出

40
长度为8,9的两根支柱为太阳能板最大面积所需支柱

题目说明

关键字:面积受限于最短支柱、支柱高度随机
题意:选两根支柱让太阳能板面积最大
思路:双指针,根据立柱大小选择需要移动的指针,在调整指针位置中记录面积最大值

解题思路及代码

这道题目的难点是数组时无序的,那为什么也可以用双指针呢?
双指针归根到底是想要达到减少无用遍历次数,提高搜索效率的目的。
有序的数组可以很好契合这个特点,如果是升序数组,指针左侧都小于指针的值,指针右侧都大于指针的值,根据题意可以很容易选择移动哪一根指针。
无序的数组要使用双指针,指针的选择不能只看数组值的大小,必须要引入其他影响因素,而这道题的影响因素是立柱之间的距离。
指针互相靠近的过程,立柱间的距离必定在减少,想要获得更大的面积那么最短的立柱必须可能变大,所以我们选择移动较小值对应的指针。

代码如下(示例):

n = list(map(int,input().split(',')))
i = 0
length = len(n)
s = 0
left = 0
right = length - 1
res = 0
while left < right:
    s = min(n[left],n[right]) * (right - left)
    res = max(res,s)
    if n[left] > n[right]:
        right -= 1
    else:
        left += 1
print(res)
                                                

总结

双指针问题既可以用于有序数组也可以用于无序数组。但在使用双指针之前,务必考虑移动两根指针能否减少很多无用的遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从那开始

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值