724 字
4 分钟
两数之和

题目描述#

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

解题思路#

  1. 哈希映射法
    • 创建哈希表存储元素值到索引的映射
    • 遍历数组,计算当前元素与目标的差值
    • 在哈希表中查找差值,若存在则返回两数索引
    • 否则将当前元素存入哈希表
  2. 一次遍历完成
    • 边遍历边检查边存储
    • 避免双重循环
  3. 顺序无关性
    • 结果索引顺序不影响正确性
    • 哈希表记录首次出现位置

关键洞察#

  1. 补数定位原理
    • 若 a + b = target,则 b = target - a
    • 哈希表记录已遍历元素,快速定位补数
  2. 先查后存机制
    • 检查补数后再存入当前元素
    • 避免同元素重复使用(如 target=4, a=2
  3. 时空效率最优
    • 牺牲空间换取时间优化
    • 一次遍历解决查找问题
  4. 边界安全性
    • 题目保证唯一解,无需额外检查
    • 空数组或单元素自动返回空

复杂度分析#

指标说明
时间复杂度O(n):单次遍历数组,哈希操作 O(1)
空间复杂度O(n):哈希表存储元素索引,最多 n 个条目

代码实现#

/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
const hashMap = {};
for (let i = 0, len = nums.length; i < len; i++) {
const targetNum = target - nums[i];
if (targetNum in hashMap) {
return [hashMap[targetNum], i]
}
hashMap[nums[i]] = i;
}
};

实际应用场景#

  1. 支付系统:查找账户余额组合达到目标金额`
  2. 商品推荐:匹配商品价格组合满足预算`
  3. 密码破解:寻找哈希值匹配的字符组合`
  4. 基因序列:寻找DNA片段互补配对位置`

相似题目#

两数之和
https://website-truelovings-projects.vercel.app/posts/algorithms/两数之和/
作者
欢迎来到StarSky的网站!
发布于
2025-08-12
许可协议
CC BY-NC-SA 4.0