兩個陣列的交集
給定兩個陣列,編寫乙個函式來計算它們的交集。
示例 1:
輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2]
示例 2:
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [9,4]
說明:輸出結果中的每個元素一定是唯一的。(這個就表示不允許重複)
我們可以不考慮輸出結果的順序。
class
solution
for(
int i =
0; i < len2; i++)}
int[
] res =
newint
[s2.
size()
];int i=0;
for(
int nn: s2)
return res;
}}
2.利用內建函式
class
solution
for(
int i =
0; i < len2; i++
)//利用內建函式
set.
retainall
(s2)
;int
res =
newint
[set.
size()
];int i=0;
for(
int nn: set)
return res;
}}
兩個陣列的交集 ii
給定兩個陣列,編寫乙個函式來計算它們的交集。
示例 1:
輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2,2]
示例 2:
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [4,9]
說明:輸出結果中每個元素出現的次數,應與元素在兩個陣列**現的次數一致。
我們可以不考慮輸出結果的順序。
高階:如果給定的陣列已經排好序呢?你將如何優化你的演算法?
如果 nums1 的大小比 nums2 小很多,哪種方法更優?
如果 nums2 的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?
1使用hashmap計算次數、
class
solution
int k =0;
int[
] ans =
newint
[len1]
;//現在大小不確定,但是可以使用函式
for(
int nn: nums2)
}return arrays.
copyofrange
(ans,
0, k);}
}
當輸入資料是有序的,推薦使用此方法。在這裡,我們對兩個陣列進行排序,並且使用兩個指標在一次掃面找出公共的數字。
class
solution
else
if(nums1[i]
> nums2[j]
)else
}return arrays.
copyofrange
(ans,
0, k);}
}
解法三:通過歸併外排將兩個陣列排序後再使用排序雙指標查詢
對應高階問題三,如果記憶體十分小,不足以將陣列全部載入記憶體,那麼必然也不能使用雜湊這類費空間的演算法,只能選用空間複雜度最小的演算法,即解法一。
但是解法一中需要改造,一般說排序演算法都是針對於內部排序,一旦涉及到跟磁碟打交道(外部排序),則需要特殊的考慮。歸併排序是天然適合外部排序的演算法,可以將分割後的子陣列寫到單個檔案中,歸併時將小檔案合併為更大的檔案。當兩個陣列均排序完成生成兩個大檔案後,即可使用雙指標遍歷兩個檔案,如此可以使空間複雜度最低。
349 兩個陣列的交集
解題思路 1.分別對兩個數字排序 2.遍歷排序胡的陣列nums1和nums2,索引分別用i,j表示,1 當nums1 i 2 當nums1 i nums j 時,則將j 3 準備乙個list陣列。若兩個數相等,則i j 若當前數nums1 i 在list陣列中未出現,則將當前數存到陣列中,只要有乙個...
349 兩個陣列的交集
給定兩個陣列,編寫乙個函式來計算它們的交集。示例 1 輸入 nums1 1,2,2,1 nums2 2,2 輸出 2 示例 2 輸入 nums1 4,9,5 nums2 9,4,9,8,4 輸出 9,4 說明 輸出結果中的每個元素一定是唯一的。我們可以不考慮輸出結果的順序。注意一 對於交集中的重複的...
349 兩個陣列的交集
給定兩個陣列,編寫乙個函式來計算它們的交集。示例 1 輸入 nums1 1,2,2,1 nums2 2,2 輸出 2 示例 2 輸入 nums1 4,9,5 nums2 9,4,9,8,4 輸出 9,4 說明 輸出結果中的每個元素一定是唯一的。我們可以不考慮輸出結果的順序。我的提交 class so...