問題: 給你兩個排序的陣列,求兩個陣列的交集。
比如: a = 1 3 4 5 7, b = 2 3 5 8 9, 那麼交集就是 3 5.
思路:1. 每一次從b陣列中取一值,然後在a陣列裡逐個比較,如果有相等的,則儲存。該演算法複雜度為 o(mn). m, n 分別為陣列 a b 的長度。
2. 因為a b 都排過序,所以,每一次從b陣列取值後,可以利用二分查詢看是否在陣列a裡有b所對應的值,這樣複雜度變成了o(n lg m)。 這裡,如果n 比 m 大,可以從a中取值,然後在b中判斷是否有a的值,這樣,複雜度為 o(m lg n)。
3. 利用hashtable. 先把a中的值存在hashtable裡,然後對於每乙個b中的值,判斷是否在a中存在,因為hashtable查詢的平均複雜度為 o(1), 所以,整個演算法複雜度為o(n), 但是,這裡的空間複雜度為 o(m) 。但是,這種方法適合陣列比較小的情況。因為如果a陣列比較大,hashtable會出現collision的情況,這樣,查詢的平均複雜度就不再是 o(1)。
因為陣列a b均排過序,所以,我們可以用兩個「指標」分別指向兩個陣列的頭部,如果其中乙個比另乙個小,移動小的那個陣列的指標;如果相等,那麼那個值是在交集裡,儲存該值,這時,同時移動兩個陣列的指標。一直這樣操作下去,直到有乙個指標已經超過陣列範圍。
public linkedlistintersection(int a, int b)
} return list;
}
通過上面的演算法可以得知,該演算法複雜度為o(n + m).
擴充套件:給兩個排序的陣列,求兩個陣列的並集。
php 兩個陣列求交集 兩個陣列的交集 II
給定兩個陣列,編寫乙個函式來計算它們的交集。輸入 nums1 1,2,2,1 nums2 2,2 輸出 2,2 輸入 nums1 4,9,5 nums2 9,4,9,8,4 輸出 4,9 輸出結果中每個元素出現的次數,應與元素在兩個陣列 現次數的最小值一致。我們可以不考慮輸出結果的順序。1.將兩個陣...
求兩個陣列的交集
方法 先用a建立 有序二叉樹,然後用b中的數值依次在二叉樹中尋找,如果找到了,就增加到交集陣列中 複雜度 建立二叉樹的複雜度logn,在二叉樹中查詢的複雜度是 logn m 1 include stdio.h int commonarray 20 int com len 0 struct node ...
求兩個陣列的交集
原址 比如a b 那麼a b 演算法一 在大多數情況,也就是一般的情況下,大家都能想出最暴力的解法,通常也就是採用遍歷或者列舉的辦法來解決問題。該題需要找出兩個陣列的交集,最簡單的乙個辦法就是用a陣列裡面的所有數去匹配b陣列裡面的數。假設兩個陣列的大小都是n,那麼這種遍歷的時間複雜度為o n 2 這...