非哈希解法:空间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