LeetCode使用JavaScript破解兩數之和

有人相愛,有人夜裡開車看海,我是leetcode第一題都做不出來

題目

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

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重複出現。

輸入:nums = [2,7,11,15], target = 9

輸出:[0,1]

解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

方式一:暴力破解

第一眼看到這個問題時,想到的解題方法就是使用for循環,兩個for循環進行遍歷,每一項進行相加,當等於target時,就可以返回他們的下標

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]
            }
        }
    }
    return []
};

這種方式屬於暴力破解,枚舉每一種可能性,雖然能解題但是耗費的性能比較大,時間複雜度:O(N^2),其中 N是數組中的元素數量。最壞情況下數組中任意兩個數都要被匹配一次。

方式二:哈希

可以創建一個哈希表,對於每一個 x,我們首先查詢哈希表中是否存在 target - x,然後將 x 插入到哈希表中,即可保證不會讓 x 和自己匹配。

具體步驟如下:

  • 第一步:創建一個map
  • 第二步:for循環遍曆數組
  • 第三步:用target減去每一項,計算哪個數能跟當前的數字相加得到target
  • 第四步:檢查map里有沒有這個數,如果有則返回結果,如果沒有則把nums[i]當做key, i當做value放入到map里
var twoSum = function(nums, target) {
    let map = new Map();
    for(let i=0;i<nums.length;i++){
        let resault =  target - nums[i]
        if(map.has(resault)){
            return [map.get(resault),i]
        }else{
            map.set(nums[i],i)
        }
    }
    return []
};

知識點

Map 對象保存鍵值對,並且能夠記住鍵的原始插入順序。任何數據類型都可以作為鍵或者值

  • Map 的一些基本操作
// 創建一個map對象
const map = new Map()
// 添加鍵值
map.set('a',1)
// 刪除值
map.delete('a')
// 是否存在某一個鍵
map.has('a')
// 獲取map的長度(不用帶括號)
map.size