返回

前端知识要点:三分钟学会LeetCode算法两个数组的交集

前端

使用 JavaScript 轻松解决 LeetCode“两个数组的交集”问题

作为前端工程师,我们经常需要处理大量数据,而算法在这个过程中扮演着至关重要的角色。LeetCode 作为算法学习的宝库,提供了众多经典算法题供我们练习。今天,我们就来一起探索如何用 JavaScript 解决 LeetCode 中的“两个数组的交集”问题。

问题

给定两个数组 nums1nums2,求出它们的交集。换句话说,找出两个数组中同时出现过的元素。

方法一:哈希表

哈希表是一种强大的数据结构,可以快速查找键值对。我们可以利用哈希表来存储数组 nums1 中的所有元素。然后,遍历数组 nums2,如果当前元素存在于哈希表中,则将其添加到交集中。

代码示例:

const intersection = (nums1, nums2) => {
  const hashTable = {};
  for (let i = 0; i < nums1.length; i++) {
    hashTable[nums1[i]] = true;
  }
  const intersection = [];
  for (let i = 0; i < nums2.length; i++) {
    if (hashTable[nums2[i]]) {
      intersection.push(nums2[i]);
      hashTable[nums2[i]] = false; // 避免重复添加
    }
  }
  return intersection;
};

复杂度分析:

  • 时间复杂度:O(n + m),其中 n 和 m 分别为数组 nums1nums2 的长度。
  • 空间复杂度:O(n),其中 n 为数组 nums1 的长度。

方法二:双指针

双指针是一种算法技巧,可以有效地比较两个数组。我们可以使用双指针来比较数组 nums1nums2,当两个指针指向相等元素时,将其添加到交集中。

代码示例:

const intersection = (nums1, nums2) => {
  nums1.sort((a, b) => a - b); // 排序数组nums1
  nums2.sort((a, b) => a - b); // 排序数组nums2
  const intersection = [];
  let i = 0;
  let j = 0;
  while (i < nums1.length && j < nums2.length) {
    if (nums1[i] === nums2[j]) {
      intersection.push(nums1[i]);
      i++;
      j++;
    } else if (nums1[i] < nums2[j]) {
      i++;
    } else {
      j++;
    }
  }
  return intersection;
};

复杂度分析:

  • 时间复杂度:O(nlogn + mlogm),其中 n 和 m 分别为数组 nums1nums2 的长度。
  • 空间复杂度:O(1)。

选择最佳方法

两种方法各有优缺点。哈希表方法的时间复杂度略高,但空间复杂度较低,并且在处理大型数组时更具优势。双指针方法的时间复杂度较低,但空间复杂度较高,更适合处理较小或中等规模的数组。

常见问题解答

1. 如果两个数组中有重复元素,交集如何处理?

无论哪种方法,都会去除重复元素,只保留交集中的唯一元素。

2. 如果两个数组为空,交集是什么?

交集为空。

3. 如何处理负数或浮点数?

哈希表方法和双指针方法都可以处理负数和浮点数。

4. 如何优化算法?

可以对数组进行预处理,删除重复元素,从而减少时间和空间复杂度。

5. 存在更好的算法吗?

对于大型数组,可以使用集合操作算法来提高性能。