[leetcode题解]01两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

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

分析

关键字:数组、查找、下标。

由于数组是无序的,查找必须要遍历,不能用二分查找,时间复杂度一般最小为O(n)。

暴力解法:遍历数组中的每一个元素,for i in range(len(list)),再次遍历,找出target-list[i]的元素的下标并返回。

                    暴力解法的时间复杂度是O(n**2),空间复杂度是O(1)。

我们如何将空间复杂度降低呢?

在插入排序中,我们把数组分成了两部分,这两部分的划分是根据遍历时的下标i,在i前的是有序数组,在i后的是待排序数组。

这一题也可以采用类似的方法,把数组分成已经查找的,和未查找的两部分,通过下标进行区分。list[:i] 和 list[i:]

当我们查找到下标为i的元素的时候,如何找到已查找序列中值等于target-list[i]的元素呢?

在python中,判断一个元素是否在容器类型之内用的是 in 语法,集合和dict字典都对 成员运算 in 做过优化,原理是hash函数,字典在找key的时候,就是把key对应的数据hash,看字典中是否存在这样的key

这道题就可以把已查找序列的每一个元素的值和下标作为键值对存放在字典中,为了方便运算,将target - list[i] 放在作为key,i作为value
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        for index, num in enumerate(nums):
            if target - num in hashmap:
                return [hashmap[target - num], index]
            hashmap[num] = index
        return []

执行结果:
通过
显示详情
执行用时 :
60 ms
, 在所有 Python3 提交中击败了
91.07%
的用户
内存消耗 :
15.1 MB
, 在所有 Python3 提交中击败了
5.05%
的用户

猜你喜欢

转载自www.cnblogs.com/forcee/p/11626015.html