【算法训练】LeetCode#350 两个数组的交集 II
一、描述
350. 两个数组的交集 II
给你两个整数数组 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]
二、思路
最简单的方法还是,逐个数组遍历,并每个数字出现次数,然后再遍历map构建数组。
不过这样无论时间还是空间复杂度都很差。
在v1基础上,v2可以只用一个map,第二次遍历时在map上做减法并记录公共数字。
三、解题
public class LeetCode350 {
public static int[] intersect(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> map01 = new HashMap<>();
HashMap<Integer,Integer> map02 = new HashMap<>();
HashMap<Integer,Integer> map03 = new HashMap<>();
int n1 = nums1.length;
int n2 = nums2.length;
for (int value : nums1) {
if (map01.containsKey(value)){
map01.put(value,map01.get(value)+1);
}else{
map01.put(value,1);
}
// 出现过则+1,否则赋值1
}
for (int value : nums2) {
if (map02.containsKey(value)){
map02.put(value,map02.get(value)+1);
}else{
map02.put(value,1);
}
// 出现过则+1,否则赋值1
}
int n = 0;
for (Map.Entry<Integer, Integer> entry: map02.entrySet()){
// 遍历
if (map01.containsKey(entry.getKey()) && map02.containsKey(entry.getKey())){
// 如果同时存在
int len = Math.min(map01.get(entry.getKey()),map02.get(entry.getKey())); // 计算最小个数
map03.put(entry.getKey(),len);
n += len;
}
}
int[] ans = new int[n];
int loc = 0;
for (Map.Entry<Integer, Integer> entry: map03.entrySet()){
int insertNum = entry.getKey();
int length = map03.get(insertNum);
for (int i = 0 ; i < length ; i++){
ans[loc++] = insertNum;
}
}
return ans;
}
public static int[] intersectV2(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> map = new HashMap<>();
int n1 = nums1.length;
int n2 = nums2.length;
for (int value : nums1) {
if (map.containsKey(value)){
map.put(value,map.get(value)+1);
}else{
map.put(value,1);
}
// 出现过则+1,否则赋值1
}
int[] ans = new int[n1+n2];
int loc = 0;
for (int value : nums2) {
if (map.containsKey(value)){
int count = map.get(value);
if (count > 0){
map.put(value,--count);
ans[loc++] = value;
}
}
}
// 拷贝0到loc
return Arrays.copyOfRange(ans,0,loc);
}
public static void main(String[] args) {
int[] nums1 = new int[]{4,9,5};
int[] nums2 = new int[]{9,4,9,8,4};
System.out.println(Arrays.toString(intersect(nums1, nums2)));
}
}