题目:
350.两个数组的交集2
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
力扣题目链接:力扣
基础:
创建map集合:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map集合函数:
获得对应key值的value-----map.getOrDefault(key, 0)-要是key值为空,则count默认值为0
map添加元素 ----- map.put(key,value);
map删除元素------ map.remove(key)
数组转换:
Arrays.copyOfRange(arr, 0, index),将数组转为长度为index,长度的数组,从索引0开始。
思路:
图解-https://assets.leetcode-cn.com/solution-static/350/350_fig1.gif
1)选择长度最短的数组(减少内存使用),使用map记录。key记录数组出现的字符,value记录该key值出现的次数。
2)遍历长的数组,每次遍历检查map中是否有key,
有key,且value值不为0。value值,减减(表示此数值已完成了求交集),将此值加入交集数组list。value值为0,继续遍历
无key,继续遍历。
3)返回交集数组
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//选取数组最短的加入map中,选取长度最短的数组
//调整函数的输入变量的顺序
if(nums1.length>nums2.length){
return intersect(nums2,nums1);
}
//将第一可变形参遍历加入map
Map<Integer,Integer> map = new HashMap();
for(int i :nums1){
int value = map.getOrDefault(i,0)+1;
map.put(i,value);
}
//遍历第二个数组,将重复的值加入新数组中
int[] res = new int[nums1.length];
int index =0;
for(int i : nums2){
//不知道map有没有这个函数
// if(map.contains(i) && map.get(i)>0){
// int value = map.getOrDefault(i);
// value--;
// list1.add(i);
// }
int value = map.getOrDefault(i,0);
if(value>0){
value--;
res[index++]=i;
if(value>0){
map.put(i,value);
}else{
map.remove(i);
}
}
}
//复制数组,大于0,转为新的数组
return Arrays.copyOfRange(res, 0, index);
}
}