题目描述
给定一个已经 按升序排列 的数组,找到两个数使他们加起来的和等于特定数。
函数应该返回这两个数的下标,index1必须小于index2。
1.你可以假设每个输入刚好只有一个答案
2.返回的下标值(index1 和 index2)不是从零开始的。
例1:
输入: nums = [2, 7, 11, 15]
target = 9
输出: [1, 2]
例2:
输入: nums = [2,3]
target = 5
输出: [1, 2]
提示:
输入数据已经排序,故使用双指针能大幅提高遍历效率(左指针,右指针向不同方向移动)
算法思路
因为数组是有序的所以假定一个有序数组a,在数组中前一个数字必然小于后一个数字,我们设定一个target,begin = 0,end = a的长度-1
所以就有如下判断
1.a[begin] + a[end] < target 时,说明两数的和偏小,需要让a[0]的下标+1
2.a[begin] + a[end] > target 时,说明两数的和偏大,需要让a[n]的下标-1
3.a[begin] + a[end] = target 时,就找到了我们需要的两个下标:当千的begin和end
如下图所示
数组: | 2 | 7 | 11 | 15 | target:9 | |
---|---|---|---|---|---|---|
下标: | 0 | 1 | 2 | 3 | ||
第一次取值 | 2 | 15 | =17 | 17>9 end-1 | ||
第一次取值 | 2 | 11 | =13 | 13>9 end-1 | ||
第一次取值 | 2 | 7 | =9 | return 下标 0,1 |
代码实现
依旧使用python实现
def getSum(arrayNums,target):
start = 0
end = len(arrayNums) -1
while start < end:
s = arrayNums[start] + arrayNums[end]
if s > target:
end -= 1
elif s < target:
start += 1
else:
return (start+1,end+1)
nums = [1,2,3,4,5,6,7]
tag = 11
s = getSum(nums, tag)
print (s)
结果输出:
(4, 7)