shunyi的刷题日记-《1. 两数之和》

22 阅读2分钟

LeetCode刷题日记

《1. 两数之和》

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 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]

示例 3:

输入: nums = [3,3], target = 6
输出: [0,1]

解题思路

首先,由于每种输入只会对应一个答案,这意味着一定存在两个数可以相加得到目标值。因此,我们可以采取以下步骤:

  1. 遍历一遍数组,将每个元素的值及其索引存储在一个 Map 中。
  2. 在遍历过程中,对于当前元素,计算其补数(即目标值减去当前元素的值)。
  3. 检查补数是否已存在于 Map 中。如果存在,则返回补数的索引和当前元素的索引。
  4. 如果补数不存在,将当前元素及其索引存入 Map,以便后续查找。

这样,我们只需遍历一次数组,即可找到满足条件的两个数。

代码

/**
 * @param {number[]} nums - 输入的数字数组
 * @param {number} target - 目标和
 * @return {number[]} - 返回两个数的索引
 */
var twoSum = function(nums, target) {
    // 创建一个 Map 集合,用于存储数组元素及其索引
    const map = new Map();

    // 遍历数组
    for (let i = 0; i < nums.length; i++) {
        // 计算当前元素需要的补数
        if (map.has(target - nums[i])) {
            // 如果 Map 中存在补数,则返回补数的索引和当前索引
            return [map.get(target - nums[i]), i];
        } else {
            // 否则,将当前元素及其索引存入 Map
            map.set(nums[i], i);
        }
    }
};

代码解析

  1. 输入参数

    • nums:一个包含数字的数组。
    • target:目标和。
  2. 创建 Map

    • 使用 const map = new Map(); 创建一个空的 Map,用于存储数组中的数字及其对应的索引。
  3. 遍历数组

    • 使用 for 循环遍历 nums 数组中的每个元素。
  4. 计算补数

    • 对于每个元素 nums[i],计算需要的补数 target - nums[i]
  5. 检查补数

    • 使用 map.has(target - nums[i]) 检查补数是否已存在于 Map 中。
    • 如果存在,使用 map.get(target - nums[i]) 获取补数的索引,并返回补数的索引和当前索引 [map.get(target - nums[i]), i]
  6. 存储当前元素

    • 如果补数不存在,将当前元素 nums[i] 和它的索引 i 存入 Map 中,以便后续查找。