
方法一:双指针
双指针的典型题目。设左右指针
python3代码
def twoSum(self, numbers: List[int], target: int) -> List[int]:low, high = 0, len(numbers) - 1while low < high:if numbers[low] + numbers[high] == target:return [low+1, high+1]elif numbers[low] + numbers[high] > target:high -= 1else:low += 1return []
时间复杂度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-1while left <= right:mid = int((left + right) / 2)if numbers[mid] > need:right = mid - 1elif numbers[mid] < need:left = mid + 1else: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] = kreturn []
