求兩個數(shù)組的交集

問題: 給你兩個數(shù)組,求兩個數(shù)組的交集。

比如: A = [1, 4, 7, 3, 5] , B = [2, 9, 3, 8, 5], 那么交集就是 [3, 5] .

方法一:

每一次從B數(shù)組中取一值,然后在A數(shù)組里逐個比較,如果有相等的,則保存。該算法復(fù)雜度為 O(MN). M, N 分別為數(shù)組 A B 的長度。

方法二:

先將A,B數(shù)組排序。因?yàn)锳 B 都排過序,所以,每一次從B數(shù)組取值后,可以利用二分查找看是否在數(shù)組A里有B所對應(yīng)的值,這樣復(fù)雜度變成了O(N lg M)。 這里,如果N 比 M 大,可以從A中取值,然后在B中判斷是否有A的值,這樣,復(fù)雜度為 O(M lg N)。

方法三:

利用hashtable.。先把A中的值存在hashtable里,然后對于每一個B中的值,判斷是否在A中存在,因?yàn)閔ashtable查找的平均復(fù)雜度為 O(1), 所以,整個算法復(fù)雜度為O(N), 但是,這里的空間復(fù)雜度為 O(M) 。但是,這種方法適合數(shù)組比較小的情況。因?yàn)槿绻鸄數(shù)組比較大,hashtable會出現(xiàn)collision(沖突)的情況,這樣,查找的平均復(fù)雜度就不再是 O(1)。

方法四:游標(biāo)(★★★):

先將A, B排序。因?yàn)閿?shù)組A, B均排過序,所以,我們可以用兩個“指針”分別指向兩個數(shù)組的頭部,如果其中一個比另一個小,移動小的那個數(shù)組的指針;如果相等,那么那個值是在交集里,保存該值,這時,同時移動兩個數(shù)組的指針。一直這樣操作下去,直到有一個指針已經(jīng)超過數(shù)組范圍。

public LinkedList<Integer> intersection(int[] A, int[] B) {  
    if (A == null || B == null || A.length == 0 || B.length == 0) return null;  
    LinkedList<Integer> result = new LinkedList<Integer>();  
    int pA = 0;  
    int pB = 0;  
    while (pA < A.length && pB < B.length) {  
        if (A[pA] < B[pB]) pA ++;  
        else if (A[pA] > B[pB]) pB++;  
        else {  
            result.add(A[pA]);  
            pA++;  
            pB++;  
        }  
    }  
  
    return result;  
  
}  

通過上面的算法可以得知,該算法復(fù)雜度為O(N + M).

** 擴(kuò)展 **:

給兩個排序的數(shù)組,求兩個數(shù)組的并集。
思路:也是用兩個指針,不相等的時候,輸出小的那個數(shù),然后移動指針,相同的時候,輸出任意一個,然后同時移動指針。

方法五:使用數(shù)組(位圖的思想)

用兩個數(shù)組分別記錄A,B數(shù)組中數(shù)字出現(xiàn)的個數(shù)。這兩個數(shù)組的下標(biāo)代表數(shù)組中的數(shù),值代表這個數(shù)出現(xiàn)的次數(shù)。然后比較每一個相同位置中數(shù)組的值,如果都不為0,說明下標(biāo)所代表的數(shù)字在A,B中都存在,相加,統(tǒng)計出這個數(shù)組出現(xiàn)的總次數(shù)。如果有一個為0,說明不是公共元素。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,935評論 0 33
  • 文/韓大爺?shù)碾s貨鋪 1. 我聽到過一個令我受用不盡的故事,由于時間太長,我已經(jīng)記不清這件事發(fā)生的時間,地點(diǎn),甚至不...
    韓大爺?shù)碾s貨鋪閱讀 2,914評論 35 133
  • 原本已經(jīng)在自己的路上有了個好的開始,可是在發(fā)現(xiàn)同一條路上出現(xiàn)了其他人的時候,自己便開始擔(dān)憂起來,忍不住和其他人比較...
    UniqueInes閱讀 224評論 0 0
  • Saver&restore主要是用于訓(xùn)練的一部分?jǐn)?shù)據(jù),如果還想繼續(xù)訓(xùn)練,就需要保存模型和重新加載上次模型 如下圖:...
    南風(fēng)無影閱讀 1,202評論 0 0
  • 這是我2017年的第一本書,斷斷續(xù)續(xù)看了7天,有一種醍醐灌頂?shù)母杏X。 在豆瓣書評上有人認(rèn)為這是一本雞湯書,呵呵。雞...
    濤tao不絕閱讀 605評論 6 10

友情鏈接更多精彩內(nèi)容