说在前面
🎈每天进行一道算法题目练习,今天的题目是“多个数组求交集”。
问题描述
给你一个二维整数数组 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 中每个数组中都出现的数字是 3 和 4 ,所以返回 [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] 中的所有值 互不相同
思路分析
读完题目之后我们首先需要先知道什么是交集,交集是一个数学名词。集合论中,设A,B是两个集合,由所有属于集合A 且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。\
如:集合 {1,2,3} 和 {2,3,4} 的交集为 {2,3}。即{1,2,3}∩{2,3,4}={2,3}。
代码来实现的话我们可以这样做:
- 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。