每日一道算法题--两数之和

183 阅读1分钟

暴力拆解

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
const twoSum = (nums,target) => {
    let j = 0
    for(let i = 0;i<nums.length;i++){
        j=i+1
        for(;j<nums.length;j++){
          if(nums[i] + nums[j] === target){
              return [i,j]
          }
        }
    }
}
  • 执行用时: 112 ms
  • 内存消耗: 38.6 MB
  • 时间复杂度: O(n2)

解法分析

  1. 两个数的和,之前就要将数组循环
  2. 然后与在其后面的数据进行叠加
  3. 与目标数据进行比较,如果相等,就输出这两个数据的下标

哈希表解法

前期知识储备

  1. map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者[原始值]) 都可以作为一个键或一个值。 简单而言就是一个有键顺序的对象
  2. map.has(key) 用来表明map 中是否存在指定元素.
  3. Map.get(key) 返回某个 Map 对象中的一个指定元素。
  4. Map.set(key,value)为 Map 对象添加或更新一个指定了键(key)和值(value)的(新)键值对。
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
const twoSum = (nums,target) => {
  const map = new Map()
  map.set(nums[0],0)
  for(let i= 1;i<nums.length;i++){
    if(map.has(target - nums[i])){
      return [i,map.get(target - nums[i])]
    }else {
      map.set(nums[i],i)
    }
  }
}
  • 执行用时: 96 ms
  • 内存消耗: 40.2 MB
  • 时间复杂度: O(n)

解法分析

  1. 利用map来对已循环过的数据进行缓存
  2. 循环的过程中判断这个数据是不是与已循环的数据相减是否能够得到一个求和数据
  3. 如果没有找到;将这个数set进去
  4. 否则 返回对应的下标

对象解法

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
const twoSum = (nums,target) => {
  const obj = {}
  obj[nums[0]] = 0
  for(let i=1;i<nums.length;i++){
    if(obj[target-nums[i]] !== undefind){
      return [i,obj[target-nums[i]]]
    }else{
      obj[nums[i]] = i
    }
  }
}
  • 执行用时: 76 ms
  • 内存消耗: 39.5 MB
  • 时间复杂度: O(n)

解法分析

  1. 利用Object来对已循环过的数据进行缓存
  2. 循环的过程中判断这个数据是不是与已循环的数据相减是否能够得到一个求和数据
  3. 如果没有找到;将这个数set进去
  4. 否则 返回对应的下标