题目
给你两个下标从 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(n²) 优化为 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 个数组的差异分析
- 流式处理:使用布隆过滤器处理超大数据流
- 数据同步:识别数据库表之间的差异记录