巧用哈希映射解决两数求和问题
给定一个整数数组 nums 和目标值 target,要求找出数组中两个数的下标,使其相加等于 target。函数应返回这两个索引。
示例:
输入:nums = [3, 2, 4], target = 6
输出:[1, 2]
解释:因为 nums[1] + nums[2] = 2 + 4 = 6,符合要求。
核心思路:一次遍历 + 值索引映射
暴力方法需要嵌套循环,时间开销大。更高效的方式是利用字典(哈希结构)记录已访问元素的值与位置,在遍历时动态判断是否存在能构成目标和的配对项。
算法步骤如下:
- 初始化空字典用于保存数值与其对应的数组下标。
- 遍历数组,对每个元素
x,计算差值diff = target - x。 - 若该差值已在字典中存在,则找到解,返回其下标和当前索引。
- 否则将当前数值和索引存入字典,继续下一轮。
流程示意
输入: [3, 2, 4], target = 6
i=0: num=3, diff=3 → 字典无3 → 存入 {3:0}
i=1: num=2, diff=4 → 字典无4 → 存入 {3:0, 2:1}
i=2: num=4, diff=2 → 字典有2 (index=1) → 返回 [1,2]
Python 实现
def findTwoSumIndices(nums, target):
"""
查找两数之和为目标值的索引对
:param nums: 整数列表
:param target: 目标整数
:return: 包含两个索引的列表
"""
index_map = {} # 数值 → 索引
for current_idx, value in enumerate(nums):
required = target - value # 所需的另一个数
if required in index_map:
return [index_map[required], current_idx]
index_map[value] = current_idx
return [] # 默认返回(题目保证有解)
测试代码:
result = findTwoSumIndices([3, 2, 4], 6)
print(result) # 输出: [1, 2]
复杂度分析
- 时间复杂度:O(n),单次扫描完成。
- 空间复杂度:O(n),哈希表最多存储 n 个键值对。
边界考虑
尽管题目确保有效输入,但设计时仍需注意:
- 负数处理:支持负数作为数组元素或中间结果。
- 重复值:后出现的值会覆盖前一个,但由于我们先查后存,不会遗漏正确配对。
- 极小数组:长度小于2的情况由题设排除。
实际应用方向
此类模式常见于:
- 交易系统中金额抵扣匹配
- 用户行为数据中的事件对关联分析
- 组合优化问题的预处理阶段
延伸题目推荐
- 三数之和(LeetCode 15)
- 子数组和为K(LeetCode 560)
- 两数之和 II(有序数组版本)
总结
本解法体现了一种典型的算法思维转变:通过引入辅助存储结构,将查找成本从线性降至常量级。关键在于在遍历过程中同时进行"查询"与"注册",避免重复工作。这种模式广泛适用于涉及配对、互补关系的搜索场景。