Leetcode:1.两数之和

126 阅读2分钟

力扣题目链接

题意:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

image.png

思路:

  • 本题要使用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 []
};