Appearance
1、简易1-两数之和
① 题目要求
数字A + B = target
,以target为求和结果,找出数组中符合的A、B数字下标。
JS
这里我拿白话文举个案例解释一下就是:
给你一个数组,比如[1,2,3,4,5],现在让你找出和为9的两个数字下标,也就是4,5下标,可以看到下标是4,5,所以返回[4,5]
第一次做算法的时候完全脑子一片蒙,无从下手,后来慢慢认真看了看题目发现是发现找符合target和的两个数字下标
建议大家也是第一次做的时候别慌,其实算法没有那么难,多刷就会了。
② 解题一(双层for)
看了题解以后,第一次以双层for循环暴力破解题目(复杂度O(n²))**
js
var twoSum = function (nums, target) {
let datas = {};
for (let i = 0; i < nums.length; i++) {
for (let s = i + 1; s < nums.length; s++) {
if (target==nums[i] + nums[s]) {
return[i,s];
}
}
}
};
var nums= [2,7,11,15];
var target = 9;
// twoSum([2,7,11,15],13);
输出如下:
console.log(twoSum([2,7,11,15],13)); //2+11 [0,2]
console.log(twoSum([2,7,11,15],22)); //2+11 [1,3]
将判断条件进行改变以后【target-nums[i]== nums[s]】 代码进行了优化
js
简单粗暴,2遍for循环逐个遍历判断
var twoSum = function (nums, target) {
let datas = {};
for (let i = 0; i < nums.length; i++)
{ for (let s = i + 1; s < nums.length; s++) {
if (target-nums[i] == nums[s])
{ return[i,s];
} } } };
③ 题解二(差值法)
考虑到哈希表利用总和减去其中一个数判断另外一个数是否存在,存在:返回进去的数字下标和差值数字的下标;不存在,则记录当前减去数字的下标,方便函数下次继续判断和使用【复杂度O(n1)】**
isNaN(6) true
js
var twoSum = function(nums, target) {
var keys = {};
for(var i = 0;i < nums.length; i++) {
var diff = target - nums[i];
// 判断差值diff在键值对中是否存在 是则找到匹配数字 数组第二个数字为7,下标为1
// keys[diff]=7,i=2
if(!isNaN(keys[diff])) {
// 返回减去的数字下标和差值数字的下标
return [keys[diff], i];
}
// 未出现匹配值 将数字存入键值对中以备后续判断
// 当前数字假设为第三个 nums[i]=7,keys[7]=1 i就是判断数字的下标 建立key值 方便下次使用
// 若是7的差值不存在,当前数字7的下标就是1,将1记录为7的下标
keys[nums[i]] = i;
}
};