一、题目
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
二、示例:
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
三、题解
/**
* 350. 两个数组的交集 II
* 简单
* 1K
* 相关企业
* 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
*
* @param nums1
* @param nums2
* @return
*/
public int[] intersect(int[] nums1, int[] nums2) {
//key:值 value: key的出现次数
HashMap<Integer, Integer> map = new HashMap<>();
//将nums1中的每个值存入map
for (int num : nums1) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
//返回结果集,先存入list,之后在转成数组,这里不直接定义数组是因为,我们开始不知道返回的结果集有多少值,也就是目前我们无法确定数组的大小
ArrayList<Integer> list = new ArrayList<>();
//遍历nums2中的每个值
for (int num : nums2) {
//看map中是包含该值
if (map.containsKey(num)) {
//如果包含,说明该值就是俩个数组共有的值
list.add(num);
//这里需要更该一下map中num对应的个数,
Integer value = map.get(num);
value--;
if (value == 0) {
//如果value等于0,那么我们将当前值从map中移除
map.remove(num);
} else {
map.put(num, value);
}
}
}
int[] ans = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
ans[i] = list.get(i);
}
return ans;
}