返回
LeetCode 每日一题:求两个数组的交集(349)—— 巧妙利用集合特性,高效求交集
见解分享
2023-09-05 16:34:38
在 LeetCode 的题海中,一道看似简单的题目——「求两个数组的交集」却暗藏着巧妙的解法,让我们一起来探索其中的奥妙。
题目回顾
给定两个整数数组 nums1
和 nums2
,返回它们 只包含一次 的公共元素。也就是说,你需要找出这两个数组中只出现过一次的元素,并且它们在两个数组中都出现过。
思考
乍一看,这个题目可以用双重循环解决:遍历数组 nums1
中的每个元素,并在数组 nums2
中查找它。但是,这样的方法时间复杂度为 O(n^2)
,当数组较大时会非常低效。
实现
我们可以利用集合的特性来优化解法。
- 使用哈希表存储数组 nums1 中的元素: 将数组
nums1
中的每个元素作为哈希表的键,并将其值设为 1。 - 遍历数组 nums2 并检查是否存在于哈希表中: 对于数组
nums2
中的每个元素,如果它在哈希表中,并且哈希表中它的值为 1,则表示该元素只在数组nums1
和nums2
中各出现一次,将其添加到结果集中。 - 更新哈希表中的值: 如果数组
nums2
中的元素不在哈希表中,或者哈希表中它的值大于 1,则表示该元素在数组nums1
中出现过多次,将其从结果集中移除。
代码实现(Python):
def intersection(nums1, nums2):
result = set()
hashtable = {}
# 将 nums1 中的元素存入哈希表
for num in nums1:
hashtable[num] = hashtable.get(num, 0) + 1
# 遍历 nums2 并检查是否存在于哈希表中
for num in nums2:
if num in hashtable and hashtable[num] == 1:
result.add(num)
else:
hashtable[num] = hashtable.get(num, 0) - 1
return list(result)
分析
时间复杂度: O(n),其中 n 是数组 nums1
和 nums2
中元素总数的和。遍历数组 nums1
和 nums2
各一次,总时间复杂度为 O(n)。
空间复杂度: O(n),哈希表中最多存储了 n 个元素。
实例
假设我们有两个数组:
nums1 = [1, 2, 2, 1]
nums2 = [2, 2]
使用我们提出的方法求解:
- 将
nums1
中的元素存入哈希表:{1: 2, 2: 2}
- 遍历
nums2
并检查是否存在于哈希表中:2
存在于哈希表中,且值等于 2,将其添加到结果集中。 - 最终,交集为
[2]
。
总结
利用集合的特性,我们可以巧妙地求两个数组的交集,时间复杂度为 O(n),空间复杂度为 O(n)。这种方法不仅高效,而且易于理解和实现。
在 LeetCode 的题目中,思考和实现往往需要结合,尝试不同的解法,运用巧妙的技巧,才能在算法的世界里游刃有余。