hashMap之两数之和

281 阅读1分钟

主要思想

用空间换时间

解决思路

  1. 如果要找到两数,首先需要遍历nums[i],然后找到对应的target-nums[i]
  2. 遍历nums[i]需要时间复杂度O(n),遍历剩下的数组,找到对应的target-nums[i]需要O(n)
  3. 所以如果是暴力枚举的话,时间复杂度是O(n^2) 但是如果用hashMap则是:
  4. 首先遍历nums[i]
  5. 遍历之后,检查hashMap中是否有值,如果有,则找到,否则加入到hashMap(这里需要注意,因为我们判断的内容是map中是否有target-nums[i],用的map.has(target-nums[i]),map需要找到键所以需要将其设置为键,而不是设置为值,这也是为什么代码中需要用map.set(nums[i],i)而不是map.set(i,nums[i])的原因)
  6. 这样的话就可以把之前遍历过的nums[i]放在一个新的内存空间中,然后下一次查找不用找i后面的数组内容,而只需要取hash内存中找即可

代码

暴力解决法

`function twoSum(nums,target){

let len = nums.length;
if(len<0) return 
//首先遍历nums[i]
for(let i=0;i<len;i++){
    //遍历找到target-nums[i],又因为其不能和i一样,所以j要从i+1开始取
    for(let j=i+1;j<len;j++){
        if(nums[i]+nums[j] == target){
            return [i,j]
        }
    }
}
return 

}`

hashMap方法

`function twoSum(nums,target){

let len = nums.length;
if(len<0) return 
let map = new Map();
for(let i=0;i<len;i++){
    if(map.has(target-nums[i])){
        return [map.get(target-nums[i]),i]
    }else{
        map.set(nums[i],i)
    }
}
return

}`