给定两个数组,写一个方法来计算它们的交集
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
一: 给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2]
.
Solution:
public int[] intersect_2(int[] nums1, int[] nums2) {//不考虑重复
Set<Integer> s2 = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int i = 0; i< nums2.length; i++){
s2.add(nums2[i]);
}
System.out.println("s2.size():"+s2.size());
for(int j = 0; j<nums1.length; j++){
if(s2.contains(nums1[j])){
result.add(nums1[j]);
}
else
continue;
}
int[] a = new int[result.size()];
int i = 0;
for(int x: result){
a[i] = x;
i++;
}
return a;
}
二:给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
Solution二:
public int[] intersect(int[] nums1, int[] nums2) {//考虑重复
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;
int j = 0;
List<Integer> l1 = new ArrayList<>();
while(i < nums1.length && j < nums2.length){
if(nums1[i] > nums2[j] ){
j++;
}
else if(nums1[i] < nums2[j]){
i++;
}
else{
l1.add(nums1[i]);
i++;
j++;
}
}
int[] a = new int[l1.size()];
int y = 0;
for(int x:l1){
a[y] = x;
y++;
}
return a;
}