leetcode-0001 兩數之和

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

1.暴力解法

直接雙重循環,枚舉出全部可能的解,時間複雜度爲O(n^2),空間複雜度爲O(1)github

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/code

相關文章
相關標籤/搜索