方法一:双指针
双指针的典型题目。设左右指针
python3代码
def twoSum(self, numbers: List[int], target: int) -> List[int]:
low, high = 0, len(numbers) - 1
while low < high:
if numbers[low] + numbers[high] == target:
return [low+1, high+1]
elif numbers[low] + numbers[high] > target:
high -= 1
else:
low += 1
return []
时间复杂度O(n)
空间复杂度O(1)
方法二:二分查找
从左到右遍历数组,固定第一个数,对第二个数进行二分查找
def twoSum(self, numbers: List[int], target: int) -> List[int]:
n = len(numbers)
for i in range(n):
need = target - numbers[i]
left, right = i+1, n-1
while left <= right:
mid = int((left + right) / 2)
if numbers[mid] > need:
right = mid - 1
elif numbers[mid] < need:
left = mid + 1
else:
return [i+1, mid+1]
return []
时间复杂度O(nlogn)
空间复杂度O(1)
方法三: 哈希表
def twoSum(self, numbers: List[int], target: int) -> List[int]:
numDict = {}
for k, num in enumerate(numbers):
if numDict.get(target - num) is not None:
return [numDict[target-num]+1, k+1]
numDict[num] = k
return []