題目
給你兩個下標從 0 開始的整數數組 nums1 和 nums2 ,請你返回一個長度為 2 的列表 answer ,其中:
answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整數組成的列表。
answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整數組成的列表。
注意:列表中的整數可以按 任意 順序返回。
一、代碼實現
func findDifference(nums1 []int, nums2 []int) [][]int {// 構建集合去重set1 := make(map[int]bool)for _, num := range nums1 {set1[num] = true}set2 := make(map[int]bool)for _, num := range nums2 {set2[num] = true}// 找nums1獨有的元素diff1 := []int{}for num := range set1 {if !set2[num] {diff1 = append(diff1, num)}}// 找nums2獨有的元素diff2 := []int{}for num := range set2 {if !set1[num] {diff2 = append(diff2, num)}}return [][]int{diff1, diff2}
}
二、算法分析
-
核心思路
- 集合去重:通過哈希表自動過濾重復元素
- 差集運算:利用集合特性快速判斷元素存在性,時間復雜度從暴力法的 O(n2) 優化為 O(n)
-
關鍵步驟
- 集合構建:遍歷兩個數組,將元素存入哈希表實現去重(時間復雜度 O(n+m))
- 差集計算:分別遍歷兩個集合,篩選出對方集合中不存在的元素
- 結果收集:將篩選結果存入最終列表,順序無關
-
復雜度
指標 值 說明 時間復雜度 O(n + m) 兩次遍歷數組 + 兩次遍歷集合 空間復雜度 O(n + m) 存儲兩個哈希表
三、圖解示例
四、邊界條件與擴展
-
特殊場景處理
? 全重疊數組:nums1 = [1,1], nums2 = [1]
→ 返回[[], []]
? 空數組輸入:若nums1
為空,則answer[0]
為空列表
? 大數據量:哈希表法可處理 1e5 級別數據量 -
多語言實現對比
# Python實現(集合差集) def findDifference(nums1, nums2):set1, set2 = set(nums1), set(nums2)return [list(set1 - set2), list(set2 - set1)]
// Java實現(流式處理) public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {Set<Integer> set1 = Arrays.stream(nums1).boxed().collect(Collectors.toSet());Set<Integer> set2 = Arrays.stream(nums2).boxed().collect(Collectors.toSet());return Arrays.asList(set1.stream().filter(n -> !set2.contains(n)).collect(Collectors.toList()),set2.stream().filter(n -> !set1.contains(n)).collect(Collectors.toList())); }
-
算法對比
方法 時間復雜度 空間復雜度 適用場景 集合差集法 O(n + m) O(n + m) 大數據量、需高效處理 暴力遍歷法 O(nm) O(1) 教學演示 排序+雙指針 O(n log n + m log m) O(1) 內存受限場景
五、總結與擴展
- 數學本質:集合運算的差集操作(A - B 和 B - A)
- 工程優化:哈希表去重與存在性檢查的 O(1) 時間復雜度優勢
- 擴展應用:
- 多數組對比:擴展至 N 個數組的差異分析
- 流式處理:使用布隆過濾器處理超大數據流
- 數據同步:識別數據庫表之間的差異記錄