JavaScript算法每日一题两个数组的交集

每日一题:每天一个新挑战;
循序渐进:从易到难,扎实掌握;
系统分类:按数据结构分类,有助于构建知识框架;
丰富题量:100 道精选题,覆盖简单/中等/困难难度。

给定两个数组 nums1nums2 ,返回 它们的 _交集_。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

代码卡片

JavaScript算法每日一题两个数组的交集

分析/求解

给定两个数组 nums1nums2,我们需要找出它们的交集,且输出结果中的每个元素必须是唯一的,并且不考虑输出顺序。

方法一:使用集合(Set)

  1. 使用集合(Set)来去重:首先将 nums1 转换为一个集合 set1,将 nums2 转换为另一个集合 set2
  2. 利用集合的交集操作,找出 set1set2 的交集元素,并将其转换为数组返回。
  • 时间复杂度:O(n + m),其中 nm 分别是 nums1nums2 的长度。转换集合和查找交集都需要线性时间。
  • 空间复杂度:O(n + m),我们使用了两个集合来存储数组的唯一元素。
var intersection = function (nums1, nums2) {
    let set1 = new Set(nums1);
    let set2 = new Set(nums2);
    return [...set1].filter(num => set2.has(num));
}

方法二:双指针法(针对已排序的数组)

  1. 将两个数组排序,然后使用双指针法找到它们的交集。
  2. 两个指针分别从两个数组的起始位置开始,比较当前指向的元素:
  3. 如果相等,加入结果集,并同时移动两个指针。
  4. 如果 nums1[i] 小于 nums2[j],移动 i 指针。
  5. 否则,移动 j 指针。
  6. 确保结果集的唯一性,避免重复元素的出现。
  • 时间复杂度:O(n log n + m log m),由于对两个数组进行了排序。
  • 空间复杂度:O(1),除了输出结果外,没有使用额外的空间。
var intersection = function (nums1, nums2) {
    nums1.sort((a, b) => a - b);
    nums2.sort((a, b) => a - b);

    let i = 0, j = 0;
    let result = [];

    while (i < nums1.length && j < nums2.length) {
        if (nums1[i] === nums2[j]) {
            if (result.length === 0 || result[result.length - 1] !== nums1[i]) {
                result.push(nums1[i]);
            }
            i++;
            j++;
        } else if (nums1[i] < nums2[j]) {
            i++;
        } else {
            j++;
        }
    }

    return result;
}

总结

通过使用集合或双指针方法,可以有效地找到两个数组的交集。使用集合方法较为直观且简单,而双指针方法在处理已排序数组时性能更优(面试时最好使用多种方法求解)。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/289000
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 4小时前
下一篇 4小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注