题目
思路
最简单的方法是两个循环的暴力解法。但是过不了,会报超时。
有一点要注意的是,返回的数组索引要加1,因为题目说数组下标从1开始。
解法一
利用数组的有序性,可以很容易想到二分搜索。那么可以通过一次遍历+二分搜索的方法解决。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
size = len(numbers)
# 从[left,right]之间搜索等于valule值的索引
def search(left,right,value):
while left <= right:
mid = (left + right) / 2
if value == numbers[mid]:
return mid
elif value < numbers[mid]:
right = mid - 1
else:
left = mid + 1
return -1
for i in range(size):
# 不需要搜索自己,right=i-1,如果有刚好等于 target - numbers[i]的,就说明找到了
result = search(0,i-1,target - numbers[i])
if result != -1:
return result+1,i+1
解法二
对撞指针
两数之和,我们可以用两个指针,一个从数组开头开始向右扫描,一个从数组末尾开始向左扫描。然后根据两个指针所在元素之和 与 目标数比较,如果相等就是要找的,否则根据不同情况移动不同指针。 直接两个指针遇到一起为止(对撞)。
class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
size = len(numbers)
# 对撞指针
# 两个指针,i指向最左端,j指向最右端,利用有序性
i,j = 0,size - 1
while i < j:
value = numbers[i] + numbers[j]
if value == target:
return i+1,j+1
elif value < target:
# 值过小,需要增加值,那么把i++即可
i += 1
else:
j -= 1
return -1,-1