「集合/字典」leetcode 349.两个数的交集(简单)

422 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

一、了解题目

附上原题链接:349. 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例:

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

对于这道题来说,有两种解法,第一种是集合,第二种是字典。那么下面我们就依据这两种方法来进行一一讲解。

二、集合解法

(1)解题思路

  • 求交集且无序唯一;
  • 使用集合。

(2)解题步骤

  • 用集合的方法对 nums1nums2 进行去重;
  • 遍历 nums1 ,筛选出 nums2 中也包含的值。

(3)代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * 
 * @param {数组1} nums1 
 * @param {数组2} nums2 
 * @returns 
 */
let intersection = function(nums1, nums2){
​
    // 1.对nums1进行数组去重
    const arr1 = new Set(nums1);
    // 2.对nums2进行数组去重
    const arr2 = new Set(nums2);
    
    // 3.过滤掉arr1在arr2中已经有的元素,过滤结果即为交集
    // has可改为includes
    const arr3 = [...arr1].filter(item => arr2.has(item));
    // 4.返回结果
    return arr3;
}
console.log(intersection([1,2,3,4],[4,6,8])); // [ 4 ]

三、字典解法

(1)解题思路

  • nums1nums2 都有的值;
  • 用字典建立一个映射关系,记录 nums1 里有的值;
  • 遍历 nums2 ,找出 nums1 里也有的值。

(2)解题步骤

  • 新建一个字典,遍历 nums1 ,填充字典;
  • 遍历 nums2 ,遇到字典里的值就选出,并从字典中删除。

(3)代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * 
 * @param {数组1} nums1 
 * @param {数组2} nums2 
 * @returns 
 */
let intersection = function(nums1, nums2){
    // 1.先建立一个字典
    const map = new Map();
    // 2.遍历nums1的每一个,并放入数组中
    nums1.forEach(n => {
        map.set(n, true);
    });
​
    // 3.定义一个空数组,用来存放最终的交集
    const res = [];
    // 4.遍历nums2中的每一个
    nums2.forEach(n => {
        // 4.1 与nums1中的对比,如果一样则push进res
        if(map.get(n)){
            res.push(n);
            map.delete(n);
        }
    });
    // 5.返回最终的结果
    return res;
}
​
console.log(intersection([1, 2, 2, 1], [2, 2])); // 1, 2

以上就是关于两个数的交集的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋