返回

LeetCode 每日一题:求两个数组的交集(349)—— 巧妙利用集合特性,高效求交集

见解分享

在 LeetCode 的题海中,一道看似简单的题目——「求两个数组的交集」却暗藏着巧妙的解法,让我们一起来探索其中的奥妙。

题目回顾

给定两个整数数组 nums1nums2,返回它们 只包含一次 的公共元素。也就是说,你需要找出这两个数组中只出现过一次的元素,并且它们在两个数组中都出现过。

思考

乍一看,这个题目可以用双重循环解决:遍历数组 nums1 中的每个元素,并在数组 nums2 中查找它。但是,这样的方法时间复杂度为 O(n^2),当数组较大时会非常低效。

实现

我们可以利用集合的特性来优化解法。

  • 使用哈希表存储数组 nums1 中的元素: 将数组 nums1 中的每个元素作为哈希表的键,并将其值设为 1。
  • 遍历数组 nums2 并检查是否存在于哈希表中: 对于数组 nums2 中的每个元素,如果它在哈希表中,并且哈希表中它的值为 1,则表示该元素只在数组 nums1nums2 中各出现一次,将其添加到结果集中。
  • 更新哈希表中的值: 如果数组 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 是数组 nums1nums2 中元素总数的和。遍历数组 nums1nums2 各一次,总时间复杂度为 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 的题目中,思考和实现往往需要结合,尝试不同的解法,运用巧妙的技巧,才能在算法的世界里游刃有余。