2248. 多个数组求交集
题目描述
给你一个二维整数数组 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 <= 10001 <= sum(nums[i].length) <= 10001 <= nums[i][j] <= 1000nums[i]中的所有值 互不相同
解法
方法一:计数
思考
求同时出现在每一个子数组中的数,并升序输出。各子数组内部元素互异,值域为 \([1,1000]\)。逐对做集合交也可以,但多次分配集合没有必要。
开长度为 \(1001\) 的计数数组,每在一个子数组中见到 \(x\) 就给 \(cnt[x]\) 加一。最后 \(cnt[x]\) 等于子数组个数的那些 \(x\) 即为交集,按下标输出已有序。
遍历数组 nums,对于每个数组 arr,统计数组 arr 中每个数字出现的次数,然后遍历计数数组,统计出现次数等于数组 nums 的长度的数字,即为答案。
时间复杂度 \(O(N)\),空间复杂度 \(O(1000)\)。其中 \(N\) 为数组 nums 中数字的总数。
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
方法二
思考
方法一扫完再收集答案。计数过程中一旦 \(cnt[x]\) 达到子数组个数,就可以立刻把 \(x\) 放入答案,少一次整表扫描。最后再排序即可。值域不大,两种写法时间同阶。
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |