目录
题目
给定两个数组 nums1
和 nums2
,返回 它们的 交集
输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
思路
原题是没有给定数组范围,如果用数组的话空间浪费,所以用set
set
- 先遍历一个数组,把他出现过的记录下来,存在一个set里
- 然后在遍历另一个,看他的元素是否包含在set中,如果在,就放在另一个set里
- 最后返回的形式是一个数组,所以要把它转化为数组的形式
数组
定义的大小只需要比题目给的1000大一点就可以了
代码
set
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){
return new int[0];//有一个为空,那么不可能出现交集的情况
}
Set<Integer> set1=new HashSet<>();//用一个来存储他出现过什么
Set<Integer> set2=new HashSet<>();//另一个存储最后结果
for(int i:nums1){
set1.add(i);//遍历第一个数组,把出现了的加到这个set集合中
}
for(int j:nums2){
if(set1.contains(j)){//遍历第二个数组,如果包含他,那么就是交集,添加
set2.add(j);
}
}
int[] arr=new int[set2.size()];//最后返回的是数组的形式可以新创建一个数组然后返回
int j=0;
for(int i:set2){
arr[j++]=i;
}
return arr;
}
}
数组
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int[] hash1 = new int[1002];
int[] hash2 = new int[1002];
for(int i : nums1)
hash1[i]++;
for(int i : nums2)
hash2[i]++;
List<Integer> resList = new ArrayList<>();
for(int i = 0; i < 1002; i++)
if(hash1[i] > 0 && hash2[i] > 0)
resList.add(i);
int index = 0;
int res[] = new int[resList.size()];
for(int i : resList)
res[index++] = i;
return res;
}
}