多个数组求交集

248 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

说在前面

🎈每天进行一道算法题目练习,今天的题目是“多个数组求交集”。

问题描述

给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组 中都出现过。

示例 1:

输入:nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]
输出:[3,4]
解释:
nums[0] = [3,1,2,4,5],nums[1] = [1,2,3,4],nums[2] = [3,4,5,6],在 nums 中每个数组中都出现的数字是 34 ,所以返回 [3,4]

示例 2:

输入:nums = [[1,2,3],[4,5,6]]
输出:[]
解释:
不存在同时出现在 nums[0] 和 nums[1] 的整数,所以返回一个空列表 []

提示:

1 <= nums.length <= 1000
1 <= sum(nums[i].length) <= 1000
1 <= nums[i][j] <= 1000
nums[i] 中的所有值 互不相同

思路分析

读完题目之后我们首先需要先知道什么是交集,交集是一个数学名词。集合论中,设AB是两个集合,由所有属于集合A 属于集合B的元素所组成的集合,叫做集合A与集合B交集(intersection),记作AB
如:集合 {1,2,3} 和 {2,3,4} 的交集为 {2,3}。即{1,2,3}∩{2,3,4}={2,3}。

image.png

代码来实现的话我们可以这样做:

  • 1 双重遍历求交集 先求第1、2个数组的交集,再求1、2数组交集和第三个数组的交集……直到遍历完整个数组即可得到多个数组的交集,代码如下:
let res = nums[0];
for(let i = 1; i < nums.length; i++){
    let temp = [];
    for(let j = 0; j < nums[i].length; j++){
        if(res.includes(nums[i][j])){
            temp.push(nums[i][j]);
        }
    }
res = [...temp];
}
  • 2 使用filter简化 我们可以使用filter来简化代码,使用一层循环加filter来求交集
let res = nums[0];
for (let i = 1; i < nums.length && ans.length; i++) {
    const temp = new Set(nums[i]);
    res = res.filter(c => temp.has(c));
}

最后要注意排个序 res.sort((a,b)=>{return a - b;});

AC代码

/**
 * @param {number[][]} nums
 * @return {number[]}
 */
var intersection = function(nums) {
    let res = nums[0];
    for(let i = 1; i < nums.length; i++){
        let temp = [];
        for(let j = 0; j < nums[i].length; j++){
            if(res.includes(nums[i][j])){
                temp.push(nums[i][j]);
            }
        }
        res = [...temp];
    }
    return res.sort((a,b)=>{return a - b;});
};

说在后面

🎉这里是JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。