解題說明
Find the Difference of Two Arrays
題目描述:給定兩個整數陣列 nums1 和 nums2,回傳一個大小為 2 的答案陣列 answer,其中 answer[0] 為 nums1 中存在但 nums2 中不存在的所有不同整數,answer[1] 為 nums2 中存在但 nums1 中不存在的所有不同整數。
解題思路:使用集合(unordered_set)快速判斷元素是否存在於另一個陣列。先將 nums1 和 nums2 各自轉為集合以去重,然後對 set1 中的每個元素,檢查是否不在 set2 中;反之亦然。集合的查詢操作平均 O(1),整體效率遠優於暴力的 O(n²) 做法。
C++ 解法
複雜度分析
時間複雜度:O(n + m) — 建立兩個集合各 O(n)、O(m),遍歷集合查詢各 O(n)、O(m),其中 n、m 分別為兩陣列長度。
空間複雜度:O(n + m) — 儲存兩個集合。
虛擬碼
1. Build set1 from nums1, set2 from nums2 2. diff1 = [x for x in set1 if x not in set2] 3. diff2 = [x for x in set2 if x not in set1] 4. Return [diff1, diff2]
其他解法
排序 + 二分搜尋 O(n log n):對兩個陣列排序後去重,對每個元素用二分搜尋查詢是否存在於另一陣列。時間 O((n+m) log(n+m)),空間 O(1)(若原地排序)。適合記憶體極度受限的場景。
暴力法 O(n × m):對 nums1 的每個元素線性掃描 nums2 判斷是否存在。時間複雜度過高,僅適合極小輸入。
延伸思考
- 若要求回傳的元素按照升序排列,應在現有解法上加哪一步?
- 若三個陣列求差集(只在 A 中、只在 B 中、只在 C 中、只在 A∩B 中…),集合運算的思路如何推廣?
- 若
nums1和nums2的元素範圍已知且有限(例如 0 到 1000),是否有比雜湊集合更快的做法?