两数之和
- 题目描述
- 示例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))。