題綱 算法
給定兩個數組,編寫一個函數來計算它們的交集。數組
示例 :函數
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [4,9]
說明:優化
方法1:spa
這種方法原則上比較暴力對全部的數都進行了一次遍歷比較,同時清空了對比數組中當前對比相同的值,以防重複檢測
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var arr = []; for(var i=0;i<nums1.length;i++){ for(var j=0;j<nums2.length;j++){ if(nums1[i] === nums2[j]) { arr.push(nums1[i]) nums2[j]=null; break; } } } return arr; };
方法二:code
這個方法是在作完方法一之後想到的優化方法
方法一在兩個對比數組基數大了之後須要循環的次數成指數上升,
方法二 則使用一個對象做爲中間存儲變量,將其中一個做爲參照的數組映射入對象中,
以數組的值爲KEY,對象值是這個映射進去的數組key在數組中出現的次數,
再循環對比數組去取obj中是否有這個key有則說明相同,將該key的值減一,以此類推
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var arr = [], obj = {}; for(var i=0;i<nums1.length;i++){ if(obj[nums1[i]]){ obj[nums1[i]] = obj[nums1[i]]+1 }else{ obj[nums1[i]] = 1; } } for(var j=0;j<nums2.length;j++){ if(obj[nums2[j]]) { arr.push(nums2[j]); obj[nums2[j]] = obj[nums2[j]]-1; } } return arr; };
方法三 對象
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var arr = []; nums1.forEach(item=>{ let a = nums2.indexOf(item); if(a>-1){ arr.push(item) nums2[a] = null } }) return arr; };
進階:blog