leetcode第一題

琦遇前端ing~發表於2020-10-12

leetcode刷題思路記錄

第一題:

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

你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。

示例:

​ 給定 nums = [2, 7, 11, 15], target = 9

​ 因為 nums[0] + nums[1] = 2 + 7 = 9
​ 所以返回 [0, 1]

**使用語言:**javascript

解題思路:

第一種:

​ 看到這個題的第一反應就是暴力解題,利用迴圈巢狀來進行解題。

​ 迴圈遍歷陣列中的每一個數,讓其與它之後的數進行迴圈相加,判斷是否等於目標值,等於則輸出即可。

提交程式碼:

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

執行用時:144ms;記憶體消耗:38.6MB

時間複雜度:O(N^2),其中N是陣列中的元素數量

空間複雜度:O(1)

第二種:

​ 雜湊表方法。

​ 顯而易見,第一種方法在尋找target-nums[i]的時候耗時過久,用了O(n),可以利用雜湊表的方式,減少尋找target-nums[i]的耗時,將耗時從O(n)減少至O(1)。

​ 建立一個雜湊表,對於每一個nums[i],從雜湊表中去尋找與其對應的target-nums[i],若不存在,則將自己插入到雜湊表中,繼續尋找;若存在,則返回這兩個值所對應的索引值。

提交程式碼:

var twoSum = function(nums, target) {
    let numsHash = {};
    for(let i=0;i<nums.length;i++){
        const numsNow = nums[i];
        const numsTarget = target - numsNow;
        const numsTargetIndex = numsHash[numsTarget];
        if(numsTargetIndex === undefined){
            numsHash[numsNow] = i;
        }else{
            return [numsTargetIndex,i];
        }
    }
};

執行用時:84ms;記憶體消耗:39.2MB

時間複雜度:O(n),n是陣列中元素的數量

空間複雜度:O(n),n是陣列中元素的數量。主要為雜湊表的開銷。

相關文章