这道题有两种解法。
- 第一种双指针法,思路是头尾指针,对应的数字相加,如果值大于目标值,则尾指针自减,小于目标值,头指针自加。非常好理解
- 因为题目指明了升序序列,所以可以应用二分法。思路是固定首位,在首位之后的序列查找目标值减首位值。但一次二分查找显然不足以找到合适的答案,所以要在循环中使用二分查找,把每一个元素都当一次首位。
第一种解法:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i, j = 0, len(numbers) - 1
while 1:
tmp = numbers[i] + numbers[j]
if tmp < target:
i += 1
elif tmp > target:
j -= 1
else:
return i + 1, j + 1
第二种解法:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i = 0
while 1:
tmp = target - numbers[i]
index = self.__binary_search(tmp, numbers[i+1:])
if index != -1:
return i + 1, i + index + 1 + 1
else:
i += 1
def __binary_search(self, target, seqs):
i, j = 0, len(seqs)
while i < j:
mid = (i + j) >> 1
if seqs[mid] == target:
return mid
elif seqs[mid] > target:
j = mid
else:
i = mid + 1
return -1
但我的二分很慢,按理说应该比第一种办法快一点,但是我的这个办法,比第二种慢了差不多10倍。