两数求和算法

题目

假设有一个整数数组 nums ,写一个方法 twoSum() ,返回数组中两个元素之和等于入参的下标数组。

假设:

  • nums[1, 2, 3, 4]
  • sum6
  • 应返回 [1, 3]

算法优化解析

  1. 所有 求和 的问题都可以转换为 求差
  2. 像这题目普遍做法是双层循环嵌套,但这时间复杂度就是 O(n^2) ,应该考虑用空间换时间,只遍历一次,遍历的同时,通过 映射关系 把之前遍历过的数据存下来,把复杂度转化为 O(n)

所以本题目:

  • 可通过备忘录模式来达到只循环一次。缓存的数据的映射关系应该为 { key(元素值): value(元素下标) }
  • 又因为 总和 - 当前值 = 目标值,查找 缓存的数据 中有无 目标值 ,若有则把 当前值目标值下标 返回,若无就缓存 当前值

解法一:js 对象

const nums = [1, 2, 3, 4]
const target = 6

function twoSum() {
  let numberMap = {}
  for (let i = 0; i < nums.length; i++) {
    if (numberMap[target - nums[i]]) {
      return [numberMap[target - nums[i]], i]
    }
    numberMap[nums[i]] = i
  }
}

twoSum()  // [1, 3]

解法二:Map 对象

const nums = [1, 2, 3, 4]
const target = 6

function twoSum() {
  let numberMap = new Map()
  for (let i = 0; i < nums.length; i++) {
    if (numberMap.has(target - nums[i])) {
      return [numberMap.get(target - nums[i]), i]
    }
    numberMap.set(nums[i], i)
  }
}

twoSum()  // [1, 3]

你可能感兴趣的:(两数求和算法)