两数之和
题目
- 给定一个整数数组 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();
| 键 | 值 |
|---|---|
| ig | 8 |
| fpx | 9 |
| edg | 11 |
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…