问题描述
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].
这是最简单的问题了
我的代码
我想也不想,直接两层for循环
var twoSum = function(nums, target) {
let length = nums.length;
for(let i = 0; i <length; i++){
for(let j = i+1; j < length; j++){
if(nums[i] + nums[j] === target){
return [i,j];
}
}
}
};
耗时:180ms
别人的代码
看了别人的52ms与56ms(思想相同,这里贴52ms的)
var twoSum = function(nums, target) {
var a = [];
for (var i = 0; i < nums.length; i++) {
var x = target - nums[i];
if (a.hasOwnProperty(x))
return [a[x], i];
a[nums[i]] = i; } };
分析学习:少了一层循环,每次target减掉对应的数组元素(称之为x),并在a数组中查找,是否有值为x的下标,有的话返回a[x],没有的话将此循环中的元素作为a数组下标,原数组下标作为a数组元素,然后自己循环
本质:创建一个记录数组,便于查找已遍历的元素,直接少了一层循环,可以说是空间换时间,换得很值