該題目來自58同城的二面,用最快速度求兩個陣列之交集演算法。
比如a=,b=,那麼a&b=。
演算法一:在大多數情況,也就是一般的情況下,大家都能想出最暴力的解法,通常也就是採用遍歷或者列舉的辦法來解決問題。
該題需要找出兩個陣列的交集,最簡單的乙個辦法就是用a陣列裡面的所有數去匹配b陣列裡面的數。假設兩個陣列的大小都是n,那麼這種遍歷的時間複雜度為o(n^2)。這個也是最複雜的情況了。
演算法二:通常下,除了用暴力列舉的問題,還有另外一種外萬金油的解法—-預處理。其實思想和c語言中的預處理一樣,對資料記性歸一化處理。說白了,在這裡就是對陣列排序。我們知道陣列排序的演算法時間複雜度最低是o(nlogn),可以看到數量級已經低於演算法一的時間複雜度。
那麼在排好序好,怎麼得到陣列的交集呢?
假設我們已經有了兩個排好序的陣列:
a=b=
那麼我們只要分別對a和b設定兩個指標i,j(或者直接說是下標),進行迴圈,偽**如下:
int count()
return total;
}時間複雜度為o(n),綜合排序的時間複雜度則整體複雜度為:o(nlogn)
演算法三:如果只是會了上面兩種,還只能說是計算機的菜鳥,而且一般面試或者筆試題也不會這麼簡單。那麼比o(nlogn)時間複雜度更低的是多少呢?一般就是o(n)。我們可以思考一下計數排序的演算法。也就是把兩個陣列a和b都遍歷到乙個新的陣列裡,然後在統計重複的數字即可,這個時間複雜度就是o(n)。當然,計數排序是有條件的,也就是要求陣列內數字的範圍是已知並且不是很大。
演算法四:上面的演算法實現簡單,也很容易達到題目的要求,但是還是有一些瑕疵,也就是非完美方案,同樣根據演算法三我們可以想出用雜湊函式或者雜湊表來解決問題。也就是將陣列a雜湊到雜湊表中,然後繼續將陣列b雜湊到雜湊表中,如果發生雜湊碰撞則統計加1,最後可以得出陣列的交集。時間複雜度也就是雜湊所有元素的複雜度o(n)。
快速求兩個陣列交集演算法
快速求出兩個陣列的交集的演算法,如果用迴圈遍歷的方法,其時間複雜度為o n n 在面試中一般不考慮這種方法。這裡提供一種快速演算法,演算法實現步驟如下 1.找到arr1的最大數max,建立乙個max 1大小的陣列result。2.以arr1中的值作為result的下標,該索引處的值 1。3.在res...
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 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 都排過序,所以,每一...