leetcode-0001 兩數之和

郭勵之發表於2020-04-16

題目地址:https://leetcode-cn.com/problems/two-sum/

1.暴力解法

直接雙重迴圈,列舉出所有可能的解,時間複雜度為O(n^2),空間複雜度為O(1)

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

2.HashTable

  • 第一次迴圈將陣列nums中的每個數都放入map中
  • 第二次迴圈判斷target - nums[i]是否在map中

時間複雜度O(n), 空間複雜度O(1)

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

  throw new Error('沒有這樣兩個數')
}

3.HashTable優化版

一次迴圈,先檢查map中是否含有target - nums[i],如果找到了,那就是我們要的結果;如果沒有找到就將這個nums[i]存入map中,繼續進行下一次迴圈,此種解法由於只迴圈了一次,因此時間複雜度會優於解法2

時間複雜度O(n),空間複雜度O(n)

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

  throw new Error('沒有這樣的兩個數')
};

更多leetcode題解和資料結構方面的知識,請關注我的github:https://github.com/GuoLizhi/

相關文章