两数之和问题 - 详细运算过程解析

算法思路回顾

使用哈希表（字典）来存储已经遍历过的数字及其索引，对于每个当前数字，计算其与目标值的差值（补数），并检查该补数是否已经在哈希表中存在。

详细运算过程

让我们通过一个具体例子来详细解析算法的执行过程：

示例： nums = [2, 7, 11, 15], target = 9

初始化阶段

```python
num_map = {}  # 创建一个空字典用于存储数字和索引的映射
```

第一次迭代 (i=0, num=2)

1. 计算补数：complement = target - num = 9 - 2 = 7
2. 检查补数7是否在num_map中：7 in num_map → 结果为False（因为字典为空）
3. 将当前数字和索引存入字典：num_map[2] = 0
4. 此时字典状态：{2: 0}

第二次迭代 (i=1, num=7)

1. 计算补数：complement = target - num = 9 - 7 = 2
2. 检查补数2是否在num_map中：2 in num_map → 结果为True（因为字典中有键2）
3. 找到匹配，返回结果：[num_map[2], 1] → [0, 1]
4. 算法结束，返回结果[0, 1]

运算过程可视化

迭代次数 当前索引(i) 当前值(num) 补数(complement) 补数是否在num_map中 num_map更新 操作说明
1 0 2 7 否 {2:0} 将2和索引0存入字典
2 1 7 2 是 - 找到匹配，返回[0,1]

关键点解析

1. 补数计算：对于每个数字，计算target - num得到补数，这个补数就是我们需要在之前遍历过的数字中寻找的值。
2. 哈希表的作用：哈希表用于存储已经遍历过的数字及其索引，这样可以在O(1)时间内检查补数是否存在。
3. 顺序重要性：算法先检查补数是否存在，然后再将当前数字存入字典，这样可以确保不会使用同一个元素两次。
4. 时间复杂度：每个元素只被访问一次，哈希表的插入和查找操作平均时间复杂度为O(1)，因此总时间复杂度为O(n)。
5. 空间复杂度：最坏情况下需要存储所有n个元素，因此空间复杂度为O(n)。

为什么这种方法有效？

这种方法有效的关键在于利用了数学关系：如果a + b = target，那么target - a = b。通过存储已经遍历过的数字，我们可以快速检查当前数字的补数是否已经出现过。

这种方法比暴力解法（双重循环）高效得多，将时间复杂度从O(n²)降低到O(n)，是典型的"以空间换时间"策略。

边界情况处理

虽然题目保证有解，但实际应用中可能需要考虑无解的情况。我们的代码在无解时会返回空列表，这是一种合理的处理方式。

这种算法设计简洁高效，是解决两数之和问题的标准方法，被广泛应用于各种编程面试和实际开发中。