非哈希解法:空间O(n),时间O(nlogn)
先添加序号排序,然后找到target/2所在位置
如果存在两个数,那么这两个数必然在target/2两边,依次寻找即可找出
class Solution: def twoSum(self , numbers: List[int], target: int) -> List[int]: # 添加序号并排序 numbers = sorted(enumerate(numbers), key = lambda x: x[1]) # 找到target一半数的位置 half = target/2 for i in range(len(numbers)): if numbers[i][1] < half: continue else: break # 两数如果存在,一定在half的左右 if numbers[i][1] == half and numbers[i+1][1] == half: return [numbers[i][0] + 1, numbers[i+1][0] + 1] j = 1 k = 0 # 依次往左往右寻找 while i-j>=0 and i+k<len(numbers): if numbers[i-j][1] + numbers[i+k][1] == target: return [min(numbers[i-j][0], numbers[i+k][0])+1, max(numbers[i-j][0], numbers[i+k][0])+1] elif numbers[i-j][1] + numbers[i+k][1] < target: k += 1 else: j += 1