给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路:第一层循环是必须的,关键是优化第二次循环,也就是寻找targrt-x的过程,这里关键采用空间换时间,也就是采用哈希表进行优化,让查找的过程变为O(1)。首先还是遍历nums数组,然后在哈希表中寻找target-x,如果不存在就把当前元素x和下标存入哈希表,如果存在就返回target-x和当前元素的下标 复杂度分析:时间复杂度O(n), n为数组的长度,空间复杂度O(n),n为数组的长度,主要是哈希表的空间开销
function twoSum(nums, target) {
const map = new Map();
for(let i = 0; i < nums.length; i++){
const com = target - nums[i];
if(map.has(com)){ //判断com是否在map中
return [map.get(com), i]; //存在的话返回两个数的下标
}else {
map.set(nums[i], i);//不存在map中就将当前元素和下标存入map
}
}
return [];
};
twoSum([6,8,3,1,5], 6)
双层for循环暴力解法:
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]
}
}
}
};