Skip to content

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;
  }
};

Released under the MIT License.