leetcode-TwoSum

TwoSum

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

分析

这个题目还是比较简单的,找到两个数字之和为给定数字就可以了,最简单的方式就是暴力法。找到所有两个数字的组合,然后从中筛选出符合条件的即可。示例代码如下:

    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        res = []
        if not nums:
        	return res
        for i in range(len(nums)):
            for j in range (i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    res.append(i)
                    res.append(j)
        return res

上述代码的时间复杂度是O(N2)的级别,那有没有更快一些的解法呢?最开始的时候自己真的是也没有想到。看了官方题解,发现居然还有这么巧妙的解法,不过就是需要额外的O(N)的空间复杂度,可以将时间复杂度降到O(N),也就是空间换时间的一种思路。将每个数字作为key,下标作为value,每次遍历的时候的,如果target-nums[i]已经存在了map里面,那么就是找到了相应的解答。
示例代码如下:

    def two_sum_hash(self,nums, target):
        res = []
        if not nums:
            return res
        hash_map = {}
        for i in range(len(nums)):
            if target - nums[i] in hash_map.keys():
                res.append(hash_map[target-nums[i]])
                res.append(i)
            else:
                hash_map[nums[i]] = i
        return res

你可能感兴趣的:(leetcode)