目录
📚 题目概要

在整数数组中找到两个数,它们的和等于目标值,并返回这两个数的下标。假设每个输入只有唯一解,且不能重复使用同一元素。
🧰 前置知识
- 哈希表:快速查找元素是否存在(O(1)时间复杂度)
- 数组遍历:理解如何遍历数组并记录中间状态
🚧 问题难点
- 暴力法不可行:双重循环时间复杂度为O(n²),无法应对大数据量。
- 如何高效匹配补数 :如何在遍历过程中快速判断"当前元素的补数(
target - num
)"是否已出现过。
🔑 关键思路
步骤拆解
- 补数思想 :对于每个元素
num
,计算其补数complement = target - num
。 - 哈希表记录历史:用字典存储已遍历元素的值和索引,键为元素值,值为索引。
- 实时匹配 :遍历时检查当前元素的补数是否存在于字典中:
- 存在 → 返回补数的索引和当前索引
- 不存在 → 将当前元素存入字典,继续遍历
💻 代码实现
python
def twoSum(nums, target):
num_map = {} # 键为元素值,值为索引
for i, num in enumerate(nums):
complement = target - num
if complement in num_map: # 补数存在于字典中,直接返回结果
return [num_map[complement], i]
num_map[num] = i # 记录当前元素信息
return [] # 题目保证有解,此return仅为语法需要
代码注释
- 第2行:初始化空字典,用于存储已遍历元素的值和索引。
- 第3行 :遍历数组,
enumerate
同时获取下标i
和元素值num
。 - 第4行:计算当前元素需要的补数。
- 第5-6行:若补数已存在字典中,返回补数的索引和当前索引。
- 第7行:若补数不存在,将当前元素存入字典。
📊 复杂度分析
- 时间复杂度:O(n),仅需一次遍历,哈希表插入和查询均为O(1)。
- 空间复杂度:O(n),最坏情况下需存储所有元素。
❗ 易错点与测试案例
易错点
- 重复元素处理 :例如输入
nums = [3, 3], target = 6
,需确保两个3的索引均被正确记录。 - 补数为自身 :如
nums = [2, 7], target = 4
,此时补数为2,但需避免返回[0, 0]
(题目保证解不重复使用元素)。
测试案例
-
案例1 :
pythonnums = [2, 7, 11, 15] target = 9 输出: [0, 1] # 2 + 7 = 9
-
案例2 :
pythonnums = [3, 2, 4] target = 6 输出: [1, 2] # 2 + 4 = 6
-
案例3 :
pythonnums = [3, 3] target = 6 输出: [0, 1] # 正确处理重复元素
🔗 总结与扩展
模式归纳
- 哈希表映射法:适用于"快速查找历史数据是否满足条件"的场景。
- 同类问题 :
- 《三数之和》:转化为两数之和问题。
- 《两数之和 II - 输入有序数组》:利用有序特性,双指针法解决。
核心思维
- 空间换时间:通过哈希表存储中间状态,将暴力法的O(n²)优化为O(n)。
- 实时匹配:遍历时动态维护哈希表,确保每次查询的补数均为已遍历元素,避免重复使用。