在Python中求解两个数组的交集,最常用的方法是使用set内置操作和双指针算法。这两种方式都能得到正确结果,但在性能和适用性上有明显区别。理解它们的差异,有助于在处理不同规模和数据特征时做出合理选择。

使用set操作求交集
set是Python内置的集合类型,支持用数学意义上的交集运算符或方法直接求出两个数组的公共元素。这种方式代码简短,可读性高。
# 使用 set 交集运算找出两数组交集
def intersect_by_set(a, b):
set_a = set(a)
set_b = set(b)
# 交集结果转为列表返回
return list(set_a & set_b)
arr1 = [1, 2, 3, 4, 5]
arr2 = [3, 4, 5, 6, 7]
print(intersect_by_set(arr1, arr2))
上面的代码先将列表转为set,再用&运算符求交集。时间复杂度接近O(n+m),但因为要建两个集合,空间复杂度是O(n+m)。
使用双指针算法求交集
双指针算法要求先对两个数组排序,再用两个下标同时遍历,相等时收集元素。它不需要额外用集合存储全部元素,适合内存敏感的场景。
# 双指针方式求两数组交集,假设输入已排序
def intersect_by_two_pointers(a, b):
a.sort()
b.sort()
i = j = 0
result = []
while i < len(a) and j < len(b):
if a[i] == b[j]:
result.append(a[i])
i += 1
j += 1
elif a[i] < b[j]:
i += 1
else:
j += 1
return result
arr1 = [1, 3, 4, 5, 2]
arr2 = [6, 4, 3, 7, 5]
print(intersect_by_two_pointers(arr1, arr2))
两种方案对比
从多个维度看,它们的特点如下:
| 对比项 | set操作 | 双指针算法 |
|---|---|---|
| 代码复杂度 | 极低 | 中等 |
| 时间复杂度 | O(n+m) | O(n log n + m log m) |
| 空间复杂度 | O(n+m) | O(1)额外空间(不计输出) |
| 是否改原数据 | 否 | 会排序原数组 |
如何选择
如果数组不大且追求开发效率,直接用set()操作最方便。如果数据量很大、内存紧张,或者数组本身已经有序,双指针算法更合适。另外要注意,set会去重,若需保留交集元素在原数组中的重复次数,双指针法更容易扩展。
实际项目中应根据数据规模、是否允许排序、是否要求稳定来做权衡,而不是盲目使用某一种写法。