1. 程式人生 > >leetcode演算法題1:兩數之和

leetcode演算法題1:兩數之和

題目:給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的 兩個 整數。

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

示例:給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

解析:

方法1:暴力法很簡單。遍歷陣列中的每個元素 ,並查詢是否存在一個值與 nums[x]+ nums[y]=target相等的目標元素。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    var result=[];  //宣告一個空陣列
    for(var i=0;i<nums.length;i++){ //遍歷陣列
        for(var j=i+1;j<nums.length;j++){
            var sum=nums[i]+nums[j];
            if(sum===target){ //判斷兩數之和是否與目標值相等
               result.push(i,j);
               return result;
            }        
        }
    }
};

twoSum([2, 7, 11, 15],9)

該方法的複雜度分析:

  • 時間複雜度:O(n^2), 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 O(n) 的時間。因此時間複雜度為 O(n^2)。

  • 空間複雜度:O(1)。 

方法2:使用查詢表來解決該問題。

設定一個map容器record用來記錄元素的值與索引

遍歷陣列nums

  • 每次遍歷時使用臨時變數complement用來儲存目標值與當前值的差值

  • 在此次遍歷中查詢record,檢視是否有與complement一致的值,如果查詢成功則返回查詢值的索引值與當前變數的值i

  • 如果未找到,則在record儲存該元素與索引值i

   var twoSum = function(nums, target) {
        var map = new Map();
        var result=[];
        for (var i = 0; i < nums.length; i++) {
            map.set(nums[i], i); //遍歷陣列,將值放到map中
        }
        for (var j = 0; j < nums.length; j++) {
            var complement = target - nums[j]; 
            if (map.get(complement)&& map.get(complement) != j) { //判斷map中是否有符合的值且下標值不重複
                result.push(j,map.get(complement));
                return result;
            }
        }
    };
    twoSum([1, 3, 4,2],6);

該方法的複雜度分析:

  • 時間複雜度:O(n), 我們把包含有 nn 個元素的列表遍歷兩次。由於雜湊表將查詢時間縮短到 O(1),所以時間複雜度為 O(n)。

  • 空間複雜度:O(n), 所需的額外空間取決於雜湊表中儲存的元素數量,該表中儲存了 n 個元素。