两数之和问题

问题描述

给定一个整数数组 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^4
· -10^9 <= nums[i] <= 10^9
· -10^9 <= target <= 10^9
· 只会存在一个有效答案

方法思路

1. 问题分析

我们需要在数组中找到两个不同的元素，它们的和等于目标值。由于数组可能很大，暴力解法（双重循环）的时间复杂度为O(n²)，效率太低。

2. 算法选择

使用哈希表来存储每个元素及其索引，这样可以在O(1)时间内检查目标值与当前元素的差值是否存在于哈希表中。

3. 算法步骤

1. 初始化一个空哈希表（字典）
2. 遍历数组中的每个元素及其索引
3. 对于每个元素，计算目标值与当前元素的差值（补数）
4. 检查该差值是否已存在于哈希表中
5. 如果存在，返回当前索引和差值的索引
6. 如果不存在，将当前元素及其索引存入哈希表

4. 复杂度分析

· 时间复杂度：O(n)，只需遍历数组一次
· 空间复杂度：O(n)，用于存储哈希表

解决代码

```python
def twoSum(nums, target):
    """
    在给定数组中找出和为目标值的两个整数的索引
    
    参数:
    nums: List[int] - 整数数组
    target: int - 目标值
    
    返回:
    List[int] - 两个整数的索引列表
    """
    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 []  # 如果没有找到，返回空列表（但题目保证有解，所以不会执行到这里）
```

代码解释

1. 初始化哈希表：num_map 用于存储元素值到索引的映射
2. 遍历数组：使用 enumerate 函数同时获取元素的索引 i 和数值 num
3. 计算补数：对于每个 num，计算 complement = target - num
4. 检查补数是否存在：如果补数存在于哈希表中，说明找到了两个数，返回它们的索引
5. 存储当前元素：如果补数不存在，将当前元素及其索引存入哈希表，以便后续查找
6. 返回结果：如果遍历结束仍未找到，返回空列表（但题目保证有解，所以不会执行到此）

这种方法确保了高效查找，适用于大规模数据输入，是解决此类问题的标准方法。