输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:
1. 求所有和为S的两个数的集合
2. 选取两个数乘积最小的那一对返回
1.求和为S的两个数
举例:
【1,2,3,4,10,11,15】递增序列,sum1 = 15
步骤 | 第一个数(small) | 第二个数(big) | 和 | 与sum1相比 | 下一步骤 |
1 | 1 | 15 | 16 | 较大 | 选取15之前的数 |
2 | 1 | 11 | 12 | 较小 | 选择1之后的数字 |
3 | 2 | 11 | 13 | 较小 | 选择2之后的数字 |
4 | 3 | 11 | 14 | 较小 | 选择3之后的数字 |
5 | 4 | 11 | 15 | 等于 |
def sumIsNumber(data,sum1):
#和为S的两位数,
#数组为递增数组,比如【1,2,3,10,11,15】,tsum=15
#left + right 与 tsum 比较
# 1+15 = 16 > 15 right-1
# 1+11 = 12 < 15 left+1
# 2+11 = 13 < 15 left+1
# 3+11 = 14 < 15 left+1
# 4+11 = 15 = 15 故为 【4,11】
if not data:
return []
left, right = 0, len(data)-1
while left<right:
he = data[left]+data[right]
if he>sum1:
right-= 1
elif he<sum1:
left += 1
else:
return [data[left],data[right]]
return []
2.选取乘积最小的一对
上面这个程序稍微改动一下,记录每对和为S的序列后选择
def sumIsNumber(array,tsum):
if not array:
return []
left, right = 0, len(array)-1
res = []
while left<right:
he = array[left]+array[right]
if he>tsum:
right-= 1
elif he<tsum:
left += 1
else:
res.append([array[left],array[right]])
left += 1
right -= 1
if res == []:
return []
else:
min_sum = res[0][0]*res[0][1]
min_index = 0
for i in range(1,len(res)):
tmp = res[i][0]*res[i][1]
if min_sum>tmp:
min_sum =tmp
min_index = i
return res[min_index]