471 字
1 分钟
两数之和
题目描述
输入
一个整数数组nums
一个整数目标值target
输出
两个数组下标,数组中这两个下标的值的和为target
约束条件
- 不能使用两次相同的下标
- 可以按任意顺序返回答案
- 只存在一个有效答案
进阶约束
- 时间复杂度需要小于
示例1
input: nums = [2,7,11,15], target = 9output: [0,1]解释: nums[0] = 2, nums[1] = 7, 2 + 7 = 9
示例2
input: nums = [3,2,4], target = 6output: [1,2]示例3
input: nums = [3,3], target = 6output: [0,1]解题思路
题目很好理解,从数组中找出两个值,和为target即可,然后返回这两个值的下标就行。
很容易想到使用双循环来完成这题,没什么思考难度,不多赘述。但是进阶约束中需要我们的时间复杂度小于,这显然就是为了卡双循环,因此此路不通。不过我们依旧可以先将这个暴力解法的代码写出来,看看能不能优化:
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: n = len(nums) for i in range(n - 1): for j in range(i + 1, n): if nums[i] + nums[j] == target: return [i, j]从暴力的第二层循环来看,它并不在乎以前的值,因为以前的值在第一层循环中已经经历过了,比如当i = 2, j = 3时,i = 1的情况在第一层循环中已经结束了,因此返过来,对于第二层循环来说,都是每个nums[j]值在前面已经遍历过的数中找和为target的配对,从这个角度上看,第一层循环就成为了非必要的循环,只要我们能找到一种方法,能够直接将以前遍历过的数存起来就行了。
什么方法能直接存以前遍历过的数值呢?显然哈希表是可以的,且它的存取都是的,这不需要自己动手造轮子,直接使用python中的defaultdict类即可。
代码
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: hh = defaultdict(int) for i, x in enumerate(nums): if target - x in hh: return [hh[target - x], i] hh[x] = i 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐









