給定兩個陣列,編寫乙個函式來計算它們的交集。
輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2,2]
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[4,9]
輸出結果中每個元素出現的次數,應與元素在兩個陣列**現次數的最小值一致。
我們可以不考慮輸出結果的順序。
1.將兩個陣列進行排序;
2.遍歷兩個陣列,當元素不相同時,移動數值較小的元素指標;
當元素相等時,將元素加入到返回的容器中,然後兩個指標均後移;
3.當某乙個陣列指標到達末尾時結束比較。
class solution ;
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
vectorres;
int size1 = nums1.size(),size2 = nums2.size();
int i=0,j=0;
while(i
時間複雜度:o(mlogm+nlogn),其中m和n分別是兩個陣列的長度。對兩個陣列進行排序的時間複雜度是o(mlogm+nlogn),遍歷兩個陣列的時間複雜度是 o(min(m,n)),因此總時間複雜度是 o(mlogm+nlogn)。
空間複雜度:o(1),因為直接建立乙個vector,不需要把答案臨時存放在乙個額外的陣列中,所以這種實現的空間複雜度為 o(1)。
stl中的sort並非只是普通的快速排序,除了對普通的快速排序進行優化,它還結合了插入排序和堆排序。根據不同的數量級別以及不同情況,能自動選用合適的排序方法。當資料量較大時採用快速排序,分段遞迴。一旦分段後的資料量小於某個閥值,為避免遞迴呼叫帶來過大的額外負荷,便會改用插入排序。而如果遞迴層次過深,有出現最壞情況的傾向,還會改用堆排序。因此,sort的平均複雜度為o(nlogn)。
由題意可知:同乙個數字可能分別在兩個陣列中重複出現多次,因此可以使用雜湊表儲存每個陣列中每個數字出現的次數。而題目需要的是交集,因此需要統計的是某一數字在兩個陣列**現次數的最小值。
1.為了減少遍歷次數,首先比較兩個陣列的元素個數,選擇個數較少的陣列,用雜湊表記錄每個數字在該陣列**現的次數;
2.然後遍歷第二個陣列,如果雜湊表中存在當前陣列元素,則將該元素新增到返回的容器中,並減少該元素在雜湊表中次數,當該元素出現次數為0時,將該元素從雜湊表中移除;
如果雜湊表中不存在當前元素,則不處理;
3.遍歷第二個陣列的結束條件有兩個:一是遍歷到陣列末尾,結束;二是當雜湊表中元素個數為零時,結束。
class solution ;
unordered_mapsam_map;
vectorres;
for(auto &n:nums1) ++sam_map[n];
res.reserve(sam_map.size());
for(auto &m:nums2) }}
return res;}};
時間複雜度:o(m+n),其中m和n分別是兩個陣列的長度。需要遍歷兩個陣列並對雜湊表進行操作,雜湊表操作的時間複雜度是 o(1),因此總時間複雜度與兩個陣列的長度和呈線性關係。
空間複雜度:o(min(m,n)),其中m和n分別是兩個陣列的長度。對較短的陣列進行雜湊表的操作,雜湊表的大小不會超過較短的陣列的長度。為返回值建立乙個vector,其容量大小為較短的陣列的長度。
求兩個陣列的交集
問題 給你兩個排序的陣列,求兩個陣列的交集。比如 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 都排過序,所以,每一...
求兩個陣列的交集
方法 先用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 這...