题目
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
解法1
哈希表
分析过程
1)创建哈希表,遍历数组1,将数值作为哈希表的键,数值出现的次数作为值,存储在哈希表中
2)遍历数组2,如果该项值与哈希表中键相等,存储该值,并将该值出现的次数减1
代码实现
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1=nums1.length;
int len2=nums2.length;
if(len1==0 || len2==0){
return new int[0];
}
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<len1;i++){
Integer value=map.get(nums1[i]);
//存储当前数值的个数
map.put(nums1[i],(value==null?1:value+1));
}
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<len2;i++){
if(map.containsKey(nums2[i]) && map.get(nums2[i])!=0){
list.add(nums2[i]);
//修改当前数值的个数
map.put(nums2[i],map.get(nums2[i])-1);
}
}
int[] results=new int[list.size()];
int i=0;
for(Integer tmp:list){
results[i++]=tmp;
}
return results;
}
}
解法2
排序
分析过程
1)将数组1,数组2分别排序
2)遍历数组1,数组2,如果值相等,存储该值,如果数组1值小于数组2的值,数组1下标加1,否则数组2的下标加1
代码实现
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1=nums1.length;
int len2=nums2.length;
if(len1==0 || len2==0){
return new int[0];
}
Arrays.sort(nums1);
Arrays.sort(nums2);
int i=0;
int j=0;
List<Integer> list=new ArrayList();
while(i<len1 && j<len2){
if(nums1[i]==nums2[j]){
list.add(nums1[i]);
i++;
j++;
}else if(nums1[i]<nums2[j]){
i++;
}else{
j++;
}
}
int k=0;
int[] result=new int[list.size()];
for(Integer tmp:list){
result[k++]=tmp;
}
return result;
}
}