leetcode2248. 多个数组求交集
一、题目描述
给你一个二维整数数组 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] 中的所有值 互不相同
二、题目解析
1、双指针
class Solution {public List<Integer> intersection(int[][] nums) {//当nums长度为1,需确保第一个元素是有序的Arrays.sort(nums[0]);int[] array = nums[0];for(int i = 1;i < nums.length;i++){array = intersect(array,nums[i]);}List<Integer> res = new ArrayList();for(int i = 0;i < array.length;i++){res.add(array[i]);}return res;}public int[] intersect(int[] nums1, int[] nums2) {Arrays.sort(nums1);Arrays.sort(nums2);int i = 0,j = 0,end = 0;int[] res = new int[nums1.length + nums2.length];while(i < nums1.length && j < nums2.length){if(nums1[i] < nums2[j]){i++;}else if(nums1[i] > nums2[j]){j++;}else{//不存在重复元素故不需特殊判断res[end++] = nums1[i];i++;j++;}}//截取数组并进行复制:copyOfRange(int []original,int from,int to),original为原始的int型数组,from为开始角标值,to为终止角标值。(其中包括from角标,不包括to角标。即处于[from,to)状态)return Arrays.copyOfRange(res,0,end);}
}
2、set
set1.retainAll(set2)方法可快速找到两个set相同元素,并去除set1中非二者交集元素
class Solution {public List<Integer> intersection(int[][] nums) {Set<Integer>set=new HashSet<>();for(int i:nums[0]) {set.add(i);}for(int i=1;i<nums.length;i++) {Set<Integer>set2=new HashSet<>();for(int j:nums[i]) {set2.add(j);}set.retainAll(set2);}List<Integer>ans=new ArrayList<>(set);Collections.sort(ans);return ans;}
}
3、统计元素出现的次数
class Solution {public List<Integer> intersection(int[][] nums) {int len = 1001;int[] array = new int[len];for (int i = 0; i < nums.length; i++){for (int j = 0; j < nums[i].length; j++){array[nums[i][j]]++;}}List<Integer> ans = new LinkedList<>();for (int i = 1; i < len; i++){if (array[i] == nums.length){ans.add(i);}}return ans;}
}