双指针问题是机考常考题型之一。它常用于解决有序数组问题。在这道题中,双指针成功的解决无序数组的最值问题。
题目表述
给航天器一侧安装长方形或正方形的太阳能板,需要先安装两个支柱,然后再在支柱的中间部分固定太阳能板。航天器不同支柱的长度不同,太阳能板的面积受限于最短一侧的那根支柱长度。
现提供一组整型数组的支柱高度数据(支柱高度随机,不一定是有序的),每根支柱之间的距离是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)
总结
双指针问题既可以用于有序数组也可以用于无序数组。但在使用双指针之前,务必考虑移动两根指针能否减少很多无用的遍历。