LeetCode350 InsectionOfTwoArraysⅡ
题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2, 2]
示例2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4, 9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
解答
解法一:map的使用
用两个map,分别用来存储nums1和nums2的数组各个元素出现的频次,然后遍历一遍map1中的key和value,如果那个key在map2中存在的话,比较两个map中最小的那个value,就是交集中那个key需要出现的次数。此时用一个arraylist来存储交集,最后转化为数组返回。
ps:这段代码真的是很难看,也费空间,就当作是回顾hashmap的遍历了。
public static int[] solve(int[] nums1, int[] nums2){
Map<Integer, Integer> map1 = new HashMap<>();
Map<Integer, Integer> map2 = new HashMap<>();
List<Integer> result = new ArrayList<>();
for (int i=0;i<nums1.length;i++){
int count = map1.getOrDefault(nums1[i],0);
map1.put(nums1[i],count+1);
}
for (int i=0;i<nums2.length;i++){
int count = map2.getOrDefault(nums2[i],0);
map2.put(nums2[i],count+1);
}
for (int key : map1.keySet()){
if (map2.containsKey(key)){
if (map1.get(key)<map2.get(key)){
for(int j=0; j<map1.get(key);j++)
result.add(key);
}
else{
for(int j=0; j<map2.get(key);j++)
result.add(key);
}
}
}
int[] intersetion=new int[result.size()];
for (int i=0; i<result.size();i++){
intersetion[i]=result.get(i);
}
return intersetion;
}
解法二:同是map的使用。
不同的是,只需要利用一个hashmap存储数组nums1的数字出现频次。然后在遍历nums2的时候,判断其是否出现在map中并且value大于0,若有,则将key添加到交集中,然后将该key的value减一再方辉map中。写法简单,看起来也清晰简洁。
private static int[] solve2(int[] nums1, int[] nums2){
Map<Integer, Integer> map1 = new HashMap<>();
List<Integer> result = new ArrayList<>();
for (int i=0;i<nums1.length;i++){
int count = map1.getOrDefault(nums1[i],0);
map1.put(nums1[i],count+1);
}
for (int i=0;i<nums2.length;i++){
if (map1.containsKey(nums2[i]) && map1.get(nums2[i])>0 ){
result.add(nums2[i]);
map1.put(nums2[i],map1.get(nums2[i])-1);
}
}
int[] intersetion=new int[result.size()];
for (int i=0; i<result.size();i++){
intersetion[i]=result.get(i);
}
return intersetion;
}