leetcode-哈希-两数之和

21 阅读2分钟

leetcode链接: leetcode.cn/problems/tw…

题目描述

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

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

示例:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

解题思路

暴力解法

最直观的思路是使用双重循环遍历数组,检查每对元素的和是否等于目标值。这种方法的时间复杂度是 O(n²),在数据量较大时效率较低。

哈希表优化

我们可以利用哈希表来优化查找过程。核心思想是:

  1. 遍历数组时,对于当前元素 nums[i],计算 target - nums[i] 的值
  2. 检查这个差值是否已经存在于哈希表中
  3. 如果存在,说明找到了匹配的两个数
  4. 如果不存在,将当前元素及其索引存入哈希表

这种方法只需要一次遍历,时间复杂度降为 O(n),空间复杂度为 O(n)。

代码实现

/**
 * @param {number[]} nums
 * @param {param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    // nums[i] + nums[j] = target
    // nums[i] = target-nums[j]
    let map = new Map()
    for (let i = 0; i < nums.length; i++) {
        if (map.has(target - nums[i])) {
            return [i, map.get(target - nums[i])]
        }
        map.set(nums[i], i)
    }
};

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组长度。我们只需要遍历一次数组。
  • 空间复杂度:O(n),最坏情况下需要存储所有元素到哈希表中。

关键点解析

  1. 哈希表的选择:JavaScript 中使用 Map 数据结构,因为它提供了 O(1) 时间复杂度的查找和插入操作。
  2. 查找顺序:先查找差值是否存在,再存储当前元素。这样可以避免使用同一个元素两次。
  3. 返回顺序:题目不要求返回顺序,所以 [i, map.get(target - nums[i])] 和 [map.get(target - nums[i]), i] 都是正确的。