1.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 <= 1000
1 <= sum(nums[i].length) <= 1000
1 <= nums[i][j] <= 1000
nums[i] 中的所有值 互不相同
第一想法 统计每个数字出现的次数,并用哈希表维护
优点:不用排序
缺点:维护次数的哈希表占用空间的大小和题目限定nums[i][j]的范围有关,会造成空间浪费
class Solution {
public List<Integer> intersection(int[][] nums) {
// 维护每个数字出现的次数
int [] arr = new int[1000];
for(int i = 0 ; i < nums.length ; i++){
for(int j = 0 ; j < nums[i].length; j++){
arr[nums[i][j] -1]++;
}
}
// 存储共同元素
List<Integer> li = new ArrayList();
for(int i = 0; i< 1000;i++){
// 每个子序列都存在,则出现的次数和子序列个数相同
if(arr[i] == nums.length)
li.add(i + 1);
}
return li;
}
}
执行结果