返回

通过JavaScript解决LeetCode两数之和问题:高效求解整数数组中目标和值

前端

算法原理

两数之和问题本质上是一个寻找数组中两个元素之和等于目标和的问题。我们可以利用哈希表的数据结构来快速查找是否存在与目标和互补的元素。哈希表是一种键值对数据结构,允许我们根据键快速检索对应的值。

具体算法步骤如下:

  1. 创建一个哈希表,将数组元素及其索引作为键值对存储在哈希表中。
  2. 遍历数组,对于每个元素,计算目标和与当前元素的差值。
  3. 检查哈希表中是否存在与差值对应的键(即是否存在与目标和互补的元素)。
  4. 如果存在,则返回当前元素的索引和哈希表中对应的索引。
  5. 如果不存在,则将当前元素及其索引添加到哈希表中,继续遍历数组。

代码示例

/**
 * 给定一个整数数组 nums 和一个整数目标值 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]
 * 解释:因为 nums[1] + nums[2] == 6,所以返回 [1, 2]。
 *
 * 示例 3:
 * 输入:nums = [3, 3], target = 6
 * 输出:[0, 1]
 * 解释:因为 nums[0] + nums[1] == 6,所以返回 [0, 1]。
 */
const twoSum = (nums, target) => {
  // 创建一个哈希表来存储数组元素及其索引
  const hashTable = {};
  for (let i = 0; i < nums.length; i++) {
    hashTable[nums[i]] = i;
  }

  // 遍历数组,寻找与目标和互补的元素
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (hashTable[complement] !== undefined && hashTable[complement] !== i) {
      return [i, hashTable[complement]];
    }
  }

  // 如果没有找到满足条件的两个元素,则返回空数组
  return [];
};

时间复杂度

该算法的时间复杂度为O(n),其中n为数组的长度。由于哈希表的操作时间复杂度为O(1),因此算法的整体时间复杂度为O(n)。

结论

本文介绍的算法是一种高效解决LeetCode两数之和问题的算法。该算法利用哈希表的数据结构来快速查找是否存在与目标和互补的元素,从而快速找到满足条件的两个整数。算法的时间复杂度为O(n),适合处理大规模数组。