# 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
。