给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer,Integer> set = new HashMap();
for(int n:nums1){
if(set.containsKey(n)){
set.put(n,set.get(n)+1);
}else{
set.put(n,1);
}
}
int i = 0;
for(int n:nums2){
if(set.containsKey(n)){
int j = set.get(n)==1?set.remove(n):set.put(n,set.get(n)-1);
nums2[i++] = n;
}
}
return Arrays.copyOfRange(nums2,0,i);
}
}
优化
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int i= 0,j=0,k=0;
int n = nums1.length;
int m = nums2.length;
int[] result = new int[Math.min(n,m)];
while(i<n&&j<m){
if(nums1[i] ==nums2[j]){
result[k++]= nums1[i++];
j++;
}else if(nums1[i]>nums2[j]){
j++;
}else{
i++;
}
}
return Arrays.copyOfRange(result,0,k);
}
}