leetcode演算法題1:兩數之和
阿新 • • 發佈:2018-11-24
題目:給定一個整數陣列 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 個元素。