兩個數組的交集 II


題綱 

  給定兩個數組,編寫一個函數來計算它們的交集。

示例 :

輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [4,9]

說明:

  • 輸出結果中每個元素出現的次數,應與元素在兩個數組中出現的次數一致。
  • 我們可以不考慮輸出結果的順序。

方法1:

這種方法原則上比較暴力對所有的數都進行了一次遍歷比較,同時清空了對比數組中當前對比相同的值,以防重復檢測
/*
* * @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; };

 方法二:

這個方法是在做完方法一以后想到的優化方法 
  方法一在兩個對比數組基數大了以后需要循環的次數成指數上升,
  方法二 則使用一個對象作為中間存儲變量,將其中一個作為參照的數組映射入對象中,
      以數組的值為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;
    
    
};  

 

 

 

進階:

  • 如果給定的數組已經排好序呢?你將如何優化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪種方法更優?
  • 如果 nums2 的元素存儲在磁盤上,磁盤內存是有限的,並且你不能一次加載所有的元素到內存中,你該怎么辦?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM