L349 L350兩個陣列的交集

2021-10-06 03:22:27 字數 2037 閱讀 7347

兩個陣列的交集

給定兩個陣列,編寫乙個函式來計算它們的交集。

示例 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...