返回

剑指 Offer 002. 两数之和

见解分享

剑指 Offer 002. 两数之和

给定一个长度为 n 的整数数组和一个目标和,从数组中找出两个数字,使得它们的和等于目标和。输出这两个数字的下标。

你可以假设每个输入只有一个解决方案,并且同一个元素不能被重复使用。

示例 1:

输入:nums = [2, 7, 11, 15], target = 9
输出:[0, 1]
解释:nums[0] + nums[1] = 2 + 7 = 9,所以返回下标 [0, 1]

示例 2:

输入:nums = [3, 2, 4], target = 6
输出:[1, 2]
解释:nums[1] + nums[2] = 2 + 4 = 6,所以返回下标 [1, 2]

示例 3:

输入:nums = [3, 3], target = 6
输出:[0, 1]
解释:nums[0] + nums[1] = 3 + 3 = 6,所以返回下标 [0, 1]

提示:

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只存在一个有效答案

解题思路

这道题的解题思路很简单,我们可以使用哈希表来存储已经遍历过的数字及其索引。当我们遍历数组时,对于每个元素,我们可以检查哈希表中是否包含 (target - nums[i])。如果包含,则意味着我们已经找到了两个数字,它们的和等于目标和。

为了提高算法的效率,我们可以使用哈希表来存储已经遍历过的数字及其索引。当我们遍历数组时,对于每个元素,我们可以检查哈希表中是否包含 (target - nums[i])。如果包含,则意味着我们已经找到了两个数字,它们的和等于目标和。

代码实现

/**
 * 给定一个长度为 n 的整数数组和一个目标和,从数组中找出两个数字,使得它们的和等于目标和。输出这两个数字的下标。
 *
 * 你可以假设每个输入只有一个解决方案,并且同一个元素不能被重复使用。
 *
 * 示例 1:
 *
 * 输入:nums = [2, 7, 11, 15], target = 9
 * 输出:[0, 1]
 * 解释:nums[0] + nums[1] = 2 + 7 = 9,所以返回下标 [0, 1]。
 *
 * 示例 2:
 *
 * 输入:nums = [3, 2, 4], target = 6
 * 输出:[1, 2]
 * 解释:nums[1] + nums[2] = 2 + 4 = 6,所以返回下标 [1, 2]。
 *
 * 示例 3:
 *
 * 输入:nums = [3, 3], target = 6
 * 输出:[0, 1]
 * 解释:nums[0] + nums[1] = 3 + 3 = 6,所以返回下标 [0, 1]。
 *
 * 提示:
 *
 * 2 <= nums.length <= 10^4
 * -10^9 <= nums[i] <= 10^9
 * -10^9 <= target <= 10^9
 * 只存在一个有效答案
 */
const twoSum = (nums, target) => {
  // 创建一个哈希表来存储已经遍历过的数字及其索引
  const hashTable = {};

  // 遍历数组
  for (let i = 0; i < nums.length; i++) {
    // 计算目标和减去当前元素
    const diff = target - nums[i];

    // 检查哈希表中是否包含目标和减去当前元素
    if (hashTable[diff] !== undefined) {
      // 如果包含,则返回两个数字的下标
      return [hashTable[diff], i];
    }

    // 将当前元素及其索引添加到哈希表中
    hashTable[nums[i]] = i;
  }

  // 如果没有找到两个数字之和等于目标和,则返回一个空数组
  return [];
};
def twoSum(nums, target):
    # 创建一个哈希表来存储已经遍历过的数字及其索引
    hashtable = {}

    # 遍历数组
    for i, num in enumerate(nums):
        # 计算目标和减去当前元素
        diff = target - num

        # 检查哈希表中是否包含目标和减去当前元素
        if diff in hashtable:
            # 如果包含,则返回两个数字的下标
            return [hashtable[diff], i]

        # 将当前元素及其索引添加到哈希表中
        hashtable[num] = i

    # 如果没有找到两个数字之和等于目标和,则返回一个空列表
    return []

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。
  • 空间复杂度:O(n),其中 n 是数组的长度。

总结

这道题的解题思路很简单,我们可以使用哈希表来存储已经遍历过的数字及其索引。当我们遍历数组时,对于每个元素,我们可以检查哈希表中是否包含 (target - nums[i])。如果包含,则意味着我们已经找到了两个数字,它们的和等于目标和。