题目,在这里只给出题目的链接,想了解的可以直接点击进去,这里就不粘贴了
所用语言: JavaScript
解法及思路
- 一看题目,首先想到的就是直接遍历,代码如下
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var result = [];
for(var index in nums) {
var second = target - nums[index];
var indexOfSecond = nums.indexOf(second);
if(index != indexOfSecond && indexOfSecond != -1) {
result.push(parseInt(index) + 1, indexOfSecond + 1);
break;
}
}
return result;
};
看似没什么问题,但最终却报超时Time Limit Exceeded
,原来还追求性能啊,看来暴力遍历是不可取的
- 那既然是这样,就优化一下吧,首相想到的是把输入中不合适的数据过滤掉,比如比
target
还要大的数
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var result = [];
var newNums = [];
nums.forEach(function(val) {
if(val < target) {
newNums.push(val);
}
});
for(var index in newNums) {
var second = target - newNums[index];
var indexOfSecond = newNums.indexOf(second);
if(index != indexOfSecond && indexOfSecond != -1) {
result.push(parseInt(index) + 1, indexOfSecond + 1);
break;
}
}
return result;
};
但最终还是和上面一样的结果Time Limit Exceeded
,而且不满足所有的情况,按照题目的意思,是需要把负数
考虑进去的
- 这个时候,可以使用
hashTable
来解决,对应就是使用JavaScript中的对象
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var map = {};
for(var i in nums) {
map[nums[i]] = parseInt(i);
}
for(i in nums) {
var first = nums[i];
var second = target - first;
if(map.hasOwnProperty(second)) {
i = parseInt(i);
if(map[second]++ != i++) {
return [i, map[second]];
}
}
}
};
可见优化空间还是挺大的