算法【简单-1.两数之和】

42 阅读2分钟

Hello,大家好,我是disguiseFish,我已经摆烂很长一段时间啦,摆烂的日子过得快乐又飞快~不知不觉都一年多了!!

最近在卷算法,但其实我的逻辑思维能力偏弱以及我之前就没有刷过算法!!所以我决定,每天写一点算法提升自己的逻辑思维!接下来我会从简入深的顺序来卷算法,同时会把看过的算法记录在这个平台~ 共勉!!!

1.两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

image.png

方法1

利用对象和“key in obj”快速判断是否存在来实现

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    var obj = {}
    let res
 // 新建一个对象  把数组的值作为对象的键,序列号作为对象的值(为了用key in obj快速判断是否存在来实现)
    nums.forEach((item, index) => {
        obj[item] = index
    })
    nums.forEach((item, index) => {
        // 目标值 - 循环当前项 得到的值在这个数组中以及这两个的序列号不一样的话
        if ((target-item) in obj && index !== obj[target-item]) {
            res =  [index, obj[target-item]]
        }
    })
    return res
}; 

方法2

利用map和数组循环比对,相当于有两个篮子,一个空篮子,一个初始篮子

var twoSum = function(nums, target) {
    var len = nums.length;
    // 如果长度不足2 直接返回空数组
    if(len < 2) return []
    // 创建一个map
    var map = new Map();
    for (var i=0; i<len; i++) {
      var num = nums[i];
      var diff = target - num;
    // 判断一个Map对象中是否含有指定 键 的diff
    // 有的话说明当前累加起来是tartget值则可以返回
      if(map.has(diff)) {
          return [map.get(diff), i]
      }
      map.set(num, i);
    }
    return []
  }