350 兩個陣列的交集 II

2021-10-08 05:44:30 字數 1929 閱讀 2015

350. 兩個陣列的交集 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 的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?

方法一:雜湊表

由於同乙個數字在兩個陣列中都可能出現多次,因此需要用雜湊表儲存每個數字出現的次數。對於乙個數字,其在交集**現的次數等於該數字在兩個陣列**現次數的最小值。

首先遍歷第乙個陣列,並在雜湊表中記錄第乙個陣列中的每個數字以及對應出現的次數,然後遍歷第二個陣列,對於第二個陣列中的每個數字,如果在雜湊表中存在這個數字,則將該數字新增到答案,並減少雜湊表中該數字出現的次數。

為了降低空間複雜度,首先遍歷較短的陣列並在雜湊表中記錄每個數字以及對應出現的次數,然後遍歷較長的陣列得到交集。

class

solution

maphashmap =

newhashmap

<

>()

;//將較短的陣列進行計數

for(

int item : nums1)

//儲存返回結果

int[

] result =

newint

[nums1.length]

;//更新資料的索引

int index =0;

for(

int item : nums2)

else}}

//result中超出真實返回長度的資料均為0,捨棄。

//返回資料

int[

] result_final =

newint

[index]

;for

(int i =

0;i < index; i++

)return result_final;

}}

方法二:排序

如果兩個陣列是有序的,則可以便捷地計算兩個陣列的交集。

首先對兩個陣列進行排序,然後使用兩個指標遍歷兩個陣列。

初始時,兩個指標分別指向兩個陣列的頭部。每次比較兩個指標指向的兩個陣列中的數字,如果兩個數字不相等,則將指向較小數字的指標右移一位,如果兩個數字相等,將該數字新增到答案,並將兩個指標都右移一位。當至少有乙個指標超出陣列範圍時,遍歷結束。

class

solution

else

if(nums1[i]

< nums2[j]

)else

if(nums1[i]

> nums2[j])}

int len = result.

size()

;int

result_final =

newint

[len]

;int index =0;

for(integer item : result)

return result_final;

}}

350 兩個陣列的交集 II

題目描述 給定兩個陣列,寫乙個方法來計算它們的交集。例如 給定 nums1 1,2,2,1 nums2 2,2 返回 2,2 注意 輸出結果中每個元素出現的次數,應與元素在兩個陣列中出現的次數一致。我們可以不考慮輸出結果的順序。跟進 如果給定的陣列已經排好序呢?你將如何優化你的演算法?如果 nums...

350 兩個陣列的交集 II

leetcode cn 探索 初級演算法 題目描述 給定兩個陣列,編寫乙個函式來計算它們的交集。示例 1 輸入 nums1 1,2,2,1 nums2 2,2 輸出 2,2 示例 2 輸入 nums1 4,9,5 nums2 9,4,9,8,4 輸出 4,9 說明 高階 c語言 2019.3.7 r...

350 兩個陣列的交集 II

題目 解答 普通人 class solution def intersect self,nums1,nums2 排序後 雙指標操作 解答 大牛 有點奇怪,跟ide中的時間判斷不一致,執行100次後ide中顯示 雙指標的解法速度更快 雙指標 time1 0.0002892017364501953 co...