1. 两数之和
Difficulty: 简单
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 10<sup>4</sup>
-10<sup>9</sup> <= nums[i] <= 10<sup>9</sup>
-10<sup>9</sup> <= target <= 10<sup>9</sup>
- 只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n<sup>2</sup>)
的算法吗?
Solution
LeetCode第一题,如果使用暴力解法,遍历两遍数组,枚举所有的可能性可解,但是O(n^2)的复杂度必然达不到要求。
暴力解法的时间复杂度过高的原因在于寻找target-e
耗费太长时间了,创建一个哈希表,对于数组中的每一个元素e
,如果e
没有在哈希表中,那么把target-e
放入哈希表,继续遍历,如果此时e
在哈希表中,说明找到了target-e
,并且返回的时候下标的顺序不受影响。
时间复杂度:O(N)
空间复杂度: O(N),哈希表
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
if not nums:
return []
d = {}
for i, e in enumerate(nums):
if e not in d:
d[target-e] = i
else:
return [i, d[e]]