leetcode-01 Tow Sum

164 阅读1分钟

题目描述

给定一个数组和一个指定的数,数组元素均为整数。返回这个数组中两个数加起来等于这个特定的数的下标(不能重复)。
eg:nums = [2, 7, 11, 15] target = 9
因为: nums[0] + nums[1] = 9 所以返回: [0, 1]

  • 第一种方法: 暴力法

第一种方法应该都能想到,使用两层循环,逐个相加去判断是否等于给定的值。

时间复杂度:O(n^2) 空间复杂度:O(1)

var twoSum = function (arr, target) {
    for (let i = 0; i < arr.length; i++) {
        for (let j =  i + 1; j < arr.length; j++) {
            if (arr[i] + arr[j] === target) {
                return [i, j]
            }
        }
    }
}
  • 第二种方法:使用键值对的数据结构来进行缓存。

基本思想是使用键值集合的数据结构比如map、object,逐个缓存到数据中,判断余下的值是否存在于这个对象。这种方法减少一层循环,将时间复杂度降为 O(n)。

时间复杂度:O(n)

  1. 使用 JavaScript 中的内置对象 Object 来实现,使用 Object 中的 in 方法来判断 target - arr[i] 是否命中缓存。
var towSum = function(arr, target) {
  const map = {}
  for (let i = 0; i <= arr.length; i++) {
    var rest = target - arr[i]
    if (rest in map) {
      return [map[rest], i]
    }
    map[arr[i]] = i
  }
}
  1. 使用 JavaScript 中的内置对象 Map 来实现, 使用 Map 中的 has 方法来判断 target - arr[i] 是否命中缓存。
var towSum = function(arr, target) {
  const map = new Map()
  for (let i = 0; i <= arr.length; i++) {
    if (map.has(target - arr[i])) {
      return [map.get(target - arr[i]), i]
    }
    map.set(arr[i], i)
  }
}
  1. 使用数组中的 indexOf 方法实现, 我认为在思想上也可以算是这种解法的一种变种。
var towSum = function(arr, target) {
  for (let i = 0; i <= arr.length; i++) {
    var position = arr.indexOf(target - arr[i])
    if (position !== -1 && position !== i) {
      return i >= position ? [position, i] : [i, position]
    }
  }
}