两数之和
- 题目描述
- 示例1
- 示例2
- 示例3
- 提示
- leetcode链接
- 解题思路
- Python 实现
- 详细解释
题目描述
给定一个整数数组 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 <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
leetcode链接
https://leetcode.cn/problems/two-sum/description
可以通过哈希表来高效地解决。具体思路如下:
解题思路
-
使用哈希表:
- 创建一个哈希表,用于存储数组中每个元素的值和对应的索引。
- 遍历数组,对于每个元素
nums[i]
,检查哈希表中是否存在target - nums[i]
。 - 如果存在,说明找到了两个数,返回它们的索引。
- 如果不存在,将当前元素
nums[i]
和它的索引i
存入哈希表中。
-
时间复杂度:
- 由于只遍历一次数组,时间复杂度为 (O(n))。
- 哈希表的查找和插入操作平均时间复杂度为 (O(1))。
-
空间复杂度:
- 哈希表的空间复杂度为 (O(n)),因为最坏情况下需要存储所有元素。
Python 实现
def twoSum(nums: List[int], target: int) -> List[int]:# 创建一个哈希表hash_map = {}# 遍历数组for i, num in enumerate(nums):# 计算目标值与当前元素的差值complement = target - num# 检查哈希表中是否存在差值if complement in hash_map:# 如果存在,返回当前元素的索引和差值的索引return [hash_map[complement], i]# 如果不存在,将当前元素和它的索引存入哈希表hash_map[num] = i
详细解释
-
初始化哈希表:
hash_map = {}
:创建一个空的字典,用于存储数组中的元素及其索引。
-
遍历数组:
for i, num in enumerate(nums)
:使用enumerate
遍历数组,同时获取每个元素的索引i
和值num
。
-
计算差值:
complement = target - num
:计算目标值target
与当前元素num
的差值complement
。
-
检查哈希表:
if complement in hash_map
:检查哈希表中是否存在complement
。return [hash_map[complement], i]
:如果存在,返回complement
的索引和当前元素的索引i
。
-
更新哈希表:
hash_map[num] = i
:如果complement
不存在,将当前元素num
和它的索引i
存入哈希表中。
通过这种方法,我们可以在一次遍历中找到两个数的索引,时间复杂度为 (O(n)),空间复杂度为 (O(n))。