注意到暴力破解时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此需要一种更优秀的方法能快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引;
使用哈希表,可以将寻找 target - x 的时间复杂度降低到从O(N) 降低到 O(1);
这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配;
代码
classSolution:deftwoSum(self, nums: List[int], target:int)-> List[int]:
hashtable =dict()#dict() 函数用于创建一个字典#字典键的特性:#1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住.#2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行for i, num inenumerate(nums):if target - num in hashtable:return[hashtable[target - num], i]
hashtable[nums[i]]= i
return[]
复杂度分析
时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。