LeetCode偶爾一題 —— 1. 兩數之和

題目描述📄

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

題目剖析🧐

一、 暴力搜索

  • 雙層循環,嘗試每一個可能的和
  • 找到 nums[i] + nums[j] === target時返回 [i, j]
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const len = nums.length
    for (let i = 0; i < len - 1; i++) {
        for (let j = i + 1; j < len; j++) {
            if (nums[i] + nums[j] === target) {
                return [i, j]
            }
        }
    }
}
  • 時間複雜度:O(n^2)
  • 空間複雜度:O(1)

思路二、空間換時間 —— 巧用哈希表

  • target - nums[i]i 的值存放在 哈希表 中,target - nums[i] 對應 i
  • 遍歷一次 nums 數組,找到一個存在於 哈希表 中的 nums[i],即找到兩個數字之和等於 target
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const map = new Map()
    for (let i = 0; i < nums.length; i++) {
        map.set(target - nums[i], i)
    }
    for (let i = 0; i < nums.length; i++) {
        const ans = map.get(nums[i])
        if (ans && ans !== i) {
            return [ i, map.get(nums[i]) ]
        }
    }
}

其實這裏還能把循環優化成爲一個,代碼如下🌰:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    const map = new Map()
    for (let i = 0; i < nums.length; i++) {
        const ans = target - nums[i]
        if (map.has(ans)) {
            return [ i, map.get(ans) ]
        }
        map.set(nums[i], i)
    }
}
  • 時間複雜度:O(n)
  • 空間複雜度:O(n)

寫在最後

一直在 LeetCode 上刷題,之前還加入了組織,有興趣加入一起學習的同學可以在下方留言或者關注我的微信公衆號「tony老師的前端補習班」並在後臺留言,可以進羣跟大佬們一起學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章