两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解答

这边题目一开始的思路是,直接判断相差元素在后面的数组中是否存在,所以写出了如下代码:

In [1]:
class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            element = nums[i]
            right = nums[i+1:]
            if target-element in right: 
                index = nums[i+1:].index(target-element)
                return [i, i+index+1]
        return []

但是实际上,这里有一个 index 操作是非常消耗性能的。

后来想了想,发现可以换个思路,从左值数组中找,并且更换数据结构,使用字典存放下标来加快查找效率。

于是写下新的代码:

In [2]:
class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        left = {}
        for i in range(len(nums)):
            element = nums[i]
            if target - element in left:
                return [left[target-element], i]
            left[element] = i
        return []

解答完毕 :)

Comments !