题目:
数组nums[]里所有元素中,有且只有两个元素组合相加后等于target,需要得到这两个元素的索引号。nums[2,7,7,15] , target = 9 是不符合要求的。
方法i
var twoSum = function(nums, target) {
let arr = [];
let obj = {};
for (let i = 0; i < nums.length; i++) {
if (typeof(obj[target - nums[i]]) !== 'undefined') {
arr.push(obj[target - nums[i]]);
arr.push(i);
}
obj[nums[i]] = i; //给属性赋值
}
return arr;
};
var nums = [3, 3, 6];
var target = 6;
console.log(twoSum(nums, target));
推导过程:
nuns = [3,3,6]
target = 6
i = 0
obj = {
}
obj[target - nums[i]] = obj[target - nums[0]] =obj[‘6 – 3’] = obj [‘3’] → undefined
obj = {
3 : 0,
}
↓
i = 1
obj = {
3 : 0
}
obj[target - nums[i]] = obj[target - nums[1]] = obj[‘6 – 3’] = obj[‘3’] = 0
i = 1
arr[0,1]
obj = {
3 : 1 //属性名一样,所以属性值更改,对象属性的唯一性
}
↓
i = 2
obj = {
3 : 1
}
obj[target - nums[i]] = obj[target - nums[2]] = obj[‘6 – 6’] = obj[‘0’] → undefined
obj = {
3 : 1,
6 : 2
}
所以obj[nums[i]] = i; 一定要放在if 后面!
方法ii
function twoSum(nums, target) {
const arr = [];
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
arr.push(i, j);
}
}
}
return arr;
}
var nums = [3, 3, 6];
var target = 6;
console.log(twoSum(nums, target));