返回

技巧分享|力扣刷题攻略:优雅写出两个数组交集

前端

力扣算法挑战:征服第 349 题,探索交集奥秘

对于任何渴望精进编程技能的人来说,刷题是必不可少的。而力扣,这一编程爱好者心中的圣地,为我们提供了海量题目和丰富的题型,助推我们的编程之旅。今天,让我们将目光投向力扣第 349 题:两个数组的交集,踏上一次算法求解的探险。

题目剖析:追寻交集的足迹

力扣第 349 题的题目要求我们求出两个给定数组的交集,即两个数组中都同时出现的元素。理解题目后,我们便可着手算法设计,寻找高效优雅的解法。

JavaScript 解法:巧用 Set,化繁为简

JavaScript 中的 Set 数据结构是求解这道题的利器。Set 可以存储唯一值,这正是我们所需要的。我们可以将两个数组中的元素分别添加到 Set 中,然后将 Set 转化为数组输出。具体代码如下:

/**
 * 求两个数组的交集
 *
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
const intersection = (nums1, nums2) => {
  const set = new Set();
  for (const num of nums1) {
    set.add(num);
  }

  const result = [];
  for (const num of nums2) {
    if (set.has(num)) {
      result.push(num);
      set.delete(num);
    }
  }

  return result;
};

优化算法:精益求精,追求极致

上面的代码虽然正确,但还有优化空间。我们可以利用 Set 的特性,在循环中直接判断 set.has(num) 即可,而不需要先将 num 添加到 Set 中再删除。这样可以减少不必要的操作,提高代码效率。优化后的代码如下:

/**
 * 求两个数组的交集
 *
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
const intersection = (nums1, nums2) => {
  const set = new Set(nums1);
  const result = [];

  for (const num of nums2) {
    if (set.has(num)) {
      result.push(num);
      set.delete(num);
    }
  }

  return result;
};

拓展视野:求索更多,深耕算法

掌握了求两个数组交集的方法后,我们可以进一步探索一些相关的算法问题,例如求两个数组的并集、差集或对称差集。这些问题都是编程面试中常见的题型,也是提升编程能力的有效途径。

结语:勇攀高峰,精进不辍

在力扣刷题的征途上,我们不仅可以巩固编程基础、锻炼算法思维,还可以结识志同道合的编程爱好者,互相交流、共同进步。因此,如果你想提升自己的编程实力,不妨加入力扣刷题大军,迎接挑战,不断超越自我。

常见问题解答

  1. 这道题的时空复杂度是多少?

    • 时空复杂度均为 O(n),其中 n 为两个数组中元素的总数。
  2. 是否有更高效的算法?

    • 对于超大规模数组,可以使用哈希表来实现,时空复杂度均为 O(1)。
  3. 求交集还有哪些其他方法?

    • 排序后使用双指针遍历、利用字典计数等。
  4. 如何求两个数组的差集和对称差集?

    • 差集:遍历数组 1,如果元素不在数组 2 中则加入结果。
    • 对称差集:求出交集和并集,然后用并集减去交集即可。
  5. 求多个数组的交集或并集该怎么做?

    • 可以使用递归或分治算法,将求多个数组的交集或并集问题分解为求两个数组的交集或并集问题。