LeetCode - 01 - Two Sum

2023-05-17 14:41:29 浏览数 (1)

# Two Sum

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

代码语言:javascript复制
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0]   nums[1] == 9 ,返回 [0, 1] 。

示例 2:

代码语言:javascript复制
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

代码语言:javascript复制
输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

# 暴力枚举

# 思路

遍历数组中每一个数 x,寻找是否存在 target - x。注意,因为 x 数之前的元素已经做过检查,因此不需要再匹配,只需要在 x 之后的元素中查找即可。

# 实现

代码语言:javascript复制
const twoSum = function (nums, target) {
  for (let i = 0; i < nums.length; i  ) {
    let x = nums[i];
    for (let j = i   1; j < nums.length; j  ) {
      let y = nums[j];
      if (x   y === target) {
        return [i, j];
      }
    }
  }
  return [];
}

# 复杂度

  • 时间:O(N2),n 是数组中元素的数量。最坏的情况下数组中任意两个数都要被匹配一遍
  • 空间:O(1)

# 哈希缓存

# 思路

暴力遍历方法中,由于没有记录已经遍历过的值的信息,会导致时间复杂度过高。使用哈希表可以将寻找 target - x 的时间复杂度从 O(N) 降到 O(1)。

创建哈希表,对于每一个数 x,先检查哈希表中是否存在期望的 target - x,如果存在就返回当前 x 的索引和哈希表中记录的 target - x 对应的索引;如果未找到,则将 x 及对应索引值存入哈希表。

# 实现

代码语言:javascript复制
const twoSum = function (nums, target) {
  const map = {};
  for (let i = 0; i < nums.length; i  ) {
    let x = nums[i];
    if (map[target - x] !== undefined) {
      return [map[target - x], i];
    } else {
      map[x] = i;
    }
  }
  return [];
};

注意!!!

代码语言:javascript复制
const map = { 2: 0 };
map[2] == false; // true
if (map[2]) {
  // 不会走到这里
  console.log('true');
}

# 复杂度

  • 时间:O(N),N 是数组中元素的数量,对于每一个元素 x,可以 O(1) 地寻找 target - x
  • 空间:O(N),哈希表的大小为 N

0 人点赞