1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
其实这个里面就是用到了一个关键的部分:map ,我们其实完全可以使用两个循环来解决这个问题,第一个循环遍历数组,第二个循环我们依然是遍历数组,然后我们将两次遍历的值相加和需要的 target 值比较,这样就可以找到这两个值。
但是很明显这样的效率可能回到 n * n,所以就我们可以进行优化,就使用一个循环就可以解决这个问题,另外一个循环使用 map 来优化,map 的查询效率是 1,所以整个的效率就会是 n。
var twoSum = function(nums, target) {
// 维护 val -> index 的映射
var valToIndex = new Map();
for (var i = 0; i < nums.length; i++) {
// 查表,看看是否有能和 nums[i] 凑出 target 的元素
var need = target - nums[i];
if (valToIndex.has(need)) {
return [valToIndex.get(need), i];
}
// 存入 val -> index 的映射
valToIndex.set(nums[i], i);
}
return null;
};