- 力扣链接
两个数组的交集II
- 题目
- 解题思路
这题最好是用HashMap,因为HashMap<Object,Object>第一个属性可以存数组的值,第二个属性用来记录该值出现的次数。
①用HashMap<Integer,Integer>存储nums1中每个数值出现的次数;
②遍历nums2,用①的map获取nums2中出现的数值的次数count,如果count>0,说明nums1中该数值出现过,那就这个数值赋值给交集数组inter[],然后count--,再把该count送回map中。
③最后返回inter数组。
- 代码
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
// 挑选出两个数组找个短的那个。这一段可省略。
if (nums1.length > nums2.length) {
return intersect(nums2, nums1);
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// nums1 = [4,9,5], nums2 = [9,4,9,8,4]
for (int num : nums1) {
// map.getOrDefault : 存在这个数就返回,不存在就返回默认值
int count = map.getOrDefault(num, 0) + 1;
map.put(num, count);
}
// 开辟一块内存空间用来存放两个数组的交集
int[] intersection = new int[nums1.length];
int index = 0;
for (int num : nums2) {
// num1中不存在这个数就在map中添加num=0
int count = map.getOrDefault(num, 0);
// 存在这个数就往后执行
if (count > 0) {
// 把这个数填充到数组中
intersection[index++] = num;
// 计数减一
count--;
// 如果还大于0,如果不考虑内存的话,这一段if、else可以省略。
if (count > 0) {
// 再次添加进去,覆盖之前那个key
map.put(num, count);
} else {
// 不大于0移除这个数
map.remove(num);
}
}
}
// public static int[] copyOfRange(int[] original, int from, int to)
// 对已有([9, 4, 0])的数组进行截取和赋值,结果为[9,4]
return Arrays.copyOfRange(intersection, 0, index);
}
}