【前端也得会算法】349. 两个数组的交集 [ 简单 ]

117 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

示例

示例 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

二、题解:

方法一 Set去重法

  • 原理。使用对象记录键值,Set存储已存在的健即可。
  • 思路。
    • 遍历数组1使用对象记录出现的值
    • 遍历数组2使用set添加数据(会自动去重掉)

代码:

var intersection = function(nums1, nums2) {
    let map = {}
    let result = new Set()
    for(let item of nums1){
        map[item] = 1
    }
    for(let item of nums2){
        if(item in map)  result.add(item)
    }
    return [...result]
};

image.png

如果先使用set存储,再判断会不会更好呢?

优化下代码:

var intersection = function(nums1, nums2) {
    let map = new Set()
    let result = []
    for(let item of nums1){
        map.add(item)
    }
    for(let item of nums2){
        if(map.has(item))  {
            result.push(item)
            map.delete(item)
        }
    }
    return result
};

image.png

方法二 双指针遍历法

  • 原理。排序后根据各自指针位置进行移动查找符合的数据。
  • 思路。
    • 两个数组分别排序
    • 使用while遍历数组
    • 相同时加入结果的set中(并去重)
    • 根据当前值大小分别移动

代码:

var intersection = function(nums1, nums2) {
    nums1.sort((x, y) => x - y);
    nums2.sort((x, y) => x - y);
    const length1 = nums1.length, length2 = nums2.length;
    let index1 = 0, index2 = 0;
    const res = new Set();
    while (index1 < length1 && index2 < length2) {
        const num1 = nums1[index1], num2 = nums2[index2];
        if (num1 === num2) {
            // 保证加入元素的唯一性
            res.add(num1);
            index1++;
            index2++;
        } else if (num1 < num2) {
            index1++;
        } else {
            index2++;
        }
    }
    return [...res];
};

image.png

三、总结

  • 此题可以Set去重法双指针遍历法两种方案
  • Set去重法主要是使用对象记录键值,Set存储已存在的健即可。
  • 双指针遍历法主要是排序后根据各自指针位置进行移动查找符合的数据。

文中如有错误,欢迎在评论区指正