算法学习自记录/两数之和

117 阅读2分钟

两数之和


题目

  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标
  • 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现

解答

我的分析

一句话总结题目

1,nums中,找到两个值数组下标
2,两个值的等于target

自己的解法思路

1,两个双重for找到两个值
2,判断两个值的和等于
3,将最后的ij两个值组成一个数组


我的答案

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
 
var twoSum = function(nums, target) {
    for(var i=0;i<nums.length;i++){
        for(var j=i+1;j<j<nums.length;j++){
            if(nums[i]+nums[j]==target){
                return [i,j]
            }
        }
    }
};

标准答案

var towSum = function (nums,target){
    let idx = new Map(); //创建一个空哈希表
    //枚举j
    for(let j = 0 ; ; j++){ 
        const x = num[j];
        //在左边找 nums[i],满足 nums[i] + x = target
        if(idx.has(target - x)){
            //找到了
            return [idx.get(target - x), j];//返回两个数的下标
        }
        idx.set(x,j);//保存 nums[i] 和 j
    }
}

答案分析

关键公式:nums[j] = target -nums[i]

将问题想象成:在一些数中找一个值 => 哈希表

解法:一边枚举j,一边把nums[j]和j加到哈希表中


结论

自我总结

1,map?

map保存 键值 对,其中可以是任何数据类型。

//创建一个Map
const royal = new Map([
    ['ig',8],
    ['fpx',9],
    ['edg',11],
])

//创建一个空哈希表
let idx = new Map();
ig8
fpx9
edg11

2,has()用法

如果Map中存在键,则map()方法返回true。

idx.has(target - x)

3,get()用法

get()方法获取Map中键的

idx.get(target - x)


引申思考

1,这个题目为什么这样想?枚举j(从右往左)

将一些数中找一些数=>在一些数中找一个值

可以是一些数的等比公式

比如:这个题目在数组中找两数之和(target),代表着在数组的一些数(x)找同一个数组中的一些数(y)。

x+y=target

换句话说:一些数(x)中找一个值(target-y)

x=target-y

2,什么类型的题可以这样做?

在一些数中找一个值,时常用哈希表。


题目来源:力扣(LeetCode)
链接:leetcode.cn/problems/tw…

其他来源:W3school
链接:www.w3school.com.cn/js/js_objec…