题解一:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
dic = {}
for i in range(len(numbers)):
dic[numbers[i]] = i
for i in range(len(numbers)):
j = target - numbers[i]
if j in dic and i != dic[j]:
return i+1, dic[j]+1
这个解法和两数之和的解法是一样的(两数之和Python3_双子叶mm的博客-CSDN博客)。
但这显然没有用上输入的是有序数组这个条件,所以还可以再进行优化。
题解二:
由于数组是非递减(递增)顺序,所以小的元素在左,大的元素在右,可以采用左右双指针解法,定义左指针left为起始位置,右指针right为列表最后一个元素位置。
若两数相加大于target,那么右指针左移一个位置;否则左指针右移一个位置,代码如下:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
left = 0
right = len(numbers)-1
while numbers[left] + numbers[right] != target:
if numbers[left] + numbers[right] > target:
right -= 1
else:
left += 1
return left+1, right+1