Leetcode: 两数之和

30 阅读3分钟

原题:leetcode.cn/problems/tw…

题目描述

给定一个整数数组 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片段互补配对位置`

相似题目