題目
給定兩個陣列,編寫乙個函式來計算它們的交集。
示例 1:說明:輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
方法一:set
主要利用set去重。
class
solution
for(
int i=
0;ivector<
int> ans;
for(
int s:s2)
return ans;}}
;
方法二:雙指標先對兩個陣列排序,然後雙指標找出交集元素。
class
solution
else
if(nums1[i]
)else
} vector<
int> ans;
for(
int ss:s)
return ans;}}
;
方法三:二分查詢先將num2排序,然後在其中二分查詢num1中的值。
二分查詢是上面方法中最快的。
題目給定兩個陣列,編寫乙個函式來計算它們的交集。
示例 1:輸入: nums1 = [1,2,2,1], nums2 = [2,2]
輸出: [2,2]
示例 2:
輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出: [4,9]
思考:如果 nums2 的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?
解答:
如果nums2的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中。那麼就無法高效地對nums2進行排序,因此推薦使用下面的方法二(雜湊)而不是方法一。在方法二中,nums2 只關係到查詢操作,因此每次讀取nums2中的一部分資料,並進行處理即可。
方法二:雜湊
由於同乙個數字在兩個陣列中都可能出現多次,因此需要用雜湊表儲存每個數字出現的次數。對於乙個數字,其在交集**現的次數等於該數字在兩個陣列**現次數的最小值。
首先遍歷第乙個陣列,並在雜湊表中記錄第乙個陣列中的每個數字以及對應出現的次數,然後遍歷第二個陣列,對於第二個陣列中的每個數字,如果在雜湊表中存在這個數字,則將該數字新增到答案,並減少雜湊表中該數字出現的次數。
為了降低空間複雜度,首先遍歷較短的陣列並在雜湊表中記錄每個數字以及對應出現的次數,然後遍歷較長的陣列得到交集。
class
solution
unordered_map<
int,
int> mp;
for(
int num:nums1)
vector<
int> ans;
for(
int num:nums2)}}
return ans;}}
;
go陣列取交集擷取
golang獲取交集沒有php那樣的array的操作函式,只能 for 迴圈判斷 package main import log sort func main 宣告乙個切片,不需要指定長度 var slice string log.println arr log.println slice 使用ma...
JS陣列取交集 並集
如果陣列中僅是字串和數值 var a 1 2,3 b 2 3,4 5 交集 2,3 var intersection a.filter item b.indexof item 1 並集 1,2,3,4,5 var union a.concat b.filter item a.indexof item...
349 取兩個陣列的交集
給定兩個陣列,編寫乙個函式來計算它們的交集。示例 1 輸入 nums1 1,2,2,1 nums2 2,2 輸出 2 示例 2 輸入 nums1 4,9,5 nums2 9,4,9,8,4 輸出 9,4 說明 輸出結果中的每個元素一定是唯一的。我們可以不考慮輸出結果的順序。1,雙重迴圈 13mscl...