一 问题描述
Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
翻译:
给定一个整数数组,返回其中两个加起来和给定的target数值相等的元素的下标。每一个测试用例保证只有一个结果,并且,数组中没有重复的元素。
二 解法
1. 第一解法(自己)
思路:
输入一个数组和一个整数,从前往后遍历这个数组,用每一个元素和之后的每一个元素相加与target比较。
代码:
var twoSum = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
for(let j = i+1; j < nums.length; j++) {
if (nums[i] + nums[j] === target)
return [i, j];
}
}
};
结果:
29 / 29 test cases passed.
Status: Accepted
Runtime: 128 ms
Memory Usage: 34.8 MB
2. 改进解法(社区)
思路:
利用Javascript提供的Map数据结构,将输入的数组元素值作为map的key,下标作为value。只遍历一次数组,将每一个元素与target相减,得到的数字在map中查找是否存在。如果存在,说明两数相加得到target,返回map的值。如果不存在,将这个元素和下标存入map。
这样做的好处就是,只遍历一遍数组。查找map的哈希算法比for要快得多。并且,由于一开始map是空的,所以,效率比从一开始就两次遍历也高得多。
代码:
var twoSum = function(nums, target) {
let seen = new Map();
let value = 0;
for (let i = 0;i < nums.length; i++) {
value = target - nums[i];
if (seen.has(value)) {
// 注意,这里两个顺序是固定的,因为题目中的要求是小的下标在前,
// seen中放的是之前查抄过的,必定下标小于i
return [seen.get(value), i];
}
seen.set(nums[i], i);
}
return [];
};
结果:
29 / 29 test cases passed.
Status: Accepted
Runtime: 64 ms
Memory Usage: 35.1 MB
By DoubleJan
2019.7.5