给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
难度:简单
提示:
暴力解决方案,尝试遍历所有的数字对,双重循环遍历当前值和另一个当前值与目标值是否相等,如果相等返回结果。
利用空间换取时间,利用散列映射方式,解题思路将目标值target减去当前值curVal的差值存储在散列表中,继续执行如果当前值在散列表中返回结果。
答案:
方法一、暴力方法双重循环遍历
var twoSum = function(nums, target) {
for (let i = 0, l = nums.length; i < l; i++) {
for (let j = i + 1; j < l; j++) {
if (nums[i] + nums[j] == target) {
return [i, j];
}
}
}
}
console.time('方法一');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法一');
方法二、借助Object对象存储
var twoSum = function(nums, target) {
let maps = {};
for (let i = 0; i < nums.length; i++) {
if (maps[target - nums[i]] == 0) {
return [maps[target - nums[i]], i]
}
maps[nums[i]] = i;
}
};
console.time('方法二');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法二');
方法三、借助Map对象存储
var twoSum = function(nums, target) {
let targetMap = new Map();
for (let i = 0; i < nums.length; i++) {
if (targetMap.has(nums[i])) {
return [targetMap.get(nums[i]), i];
}
targetMap.set(target - nums[i], i);
}
};
console.time('方法三');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法三');
方法四、借助Object使用while循环
var twoSum = function(nums, target) {
let map = {};
let loop = 0;
let dis;
while (loop < nums.length) {
dis = target - nums[loop];
if (map[dis] != undefined) {
return [map[dis], loop];
}
map[nums[loop]] = loop;
loop++;
}
};
console.time('方法四');
twoSum([2, 7, 11, 15], 9);
console.timeEnd('方法四');