LeetCode 1 [Two Sum]

原题

给一个整数数组,找到两个数使得他们的和等于一个给定的数target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是1到n,不是以0开头。

numbers=[2, 7, 11, 15], target=9, return [1, 2]

解题思路

  • 对撞型指针
  • 由于要返回下标,所以先建立一个hash map储存每个值得下标
  • 两个指针分别从数组的头跟尾向中间扫描,如果两个数的和等于target则回到hash map中找到相应最小的下标返回,否则相应的移动头指针或者尾指针,知道两个指针相撞,结束

完整代码

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        index = {}
        for i, num in enumerate(nums):
            if num not in index:
                index[num] = [i]
            else:
                index[num].append(i)
                
        sortedNums = sorted(nums)
        i, j = 0, len(nums) - 1
        while i < j:
            if sortedNums[i] + sortedNums[j] == target:
                if sortedNums[i] == sortedNums[j]:
                    return [index[sortedNums[i]][0], index[sortedNums[i]][1]]
                else:
                    res = [index[sortedNums[i]][0], index[sortedNums[j]][0]]
                    return sorted(res)
            elif sortedNums[i] + sortedNums[j] > target:
                j -= 1
            else:
                i += 1

你可能感兴趣的:(LeetCode 1 [Two Sum])