题意:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
思路:
- 本题要使用map,用set和数组都有局限:
- 数组的大小是受限制的,且若元素很少,而哈希值太大会造成内存空间的浪费
- set是一个只能放值的集合,而这题不仅需要判断数是否存在,还有返回下标,所以也不合适
- 创建一个map
- 用for循环遍历数组,并计算complement = target-num[i]的大小,这是用来计算哪个数能与当前数加起来的值是target
- 判断complement的值是否在map中:
- 若存在,则说明数组中有与之相加为target的值
- 若不存在,则将nums[i]以map的key传入,将下标i作为value(这是因为map.has()方法,它检测的是键的值,方便我们查找)
- 遍历完整个数组,依然没有找到的话,则返回一个空数组
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
//创建一个map集合
let map = new Map()
//for循环遍历nums数组,并用target-nums[i],以计算哪个数能与当前的数加起来能得到target
for(let i=0;i<nums.length;i++){
let complement = target - nums[i]
//检查map里是否有这个数:
if(map.has(complement)){
//若有,则返回这个数和当前数的下标
return [map.get(complement),i]
}else{
//若没有,则将nums[i]以key的形式放入map中,i当作value放入map
map.set(nums[i],i)
}
}
//若遍历完数组还没找到,则返回空数组
return []
};