题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
思路解析
- 利用map分别统计两个数组中数据的出现次数
- 利用map存储交集
- 将map还原成数组
package com.wy;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author HelloWorld
* @create 2021-05-09-13:33
* @email 154803771@qq.com
*/
public class Demo1 {
//两个数组的交集 II
public static void main(String[] args) {
int[] nums1 = {4,9,5}, nums2 = {9,4,9,8,4};
int[] intersects = intersect(nums1, nums2);
for (int num : intersects) {
System.out.print(num + " ");
}
}
public static int[] intersect(int[] nums1, int[] nums2) {
// 1.记录数组中的元素及其出现次数
Map<Integer, Integer> map1 = getMap(nums1);
Map<Integer, Integer> map2 = getMap(nums2);
Map<Integer, Integer> map = new HashMap<>();
int length = 0, data;
Set<Integer> keySet = map1.keySet();
// 2.存储两个数组中都出现过的元素
for (Integer key : keySet) {
if (map2.containsKey(key)) {
data = Math.min(map1.get(key), map2.get(key));
map.put(key, data);
// 记录交集的长度
length += data;
}
}
int[] result = new int[length];
keySet = map.keySet();
int i = 0;
// 3.将map还原为数组
for (Integer key : keySet) {
data = map.get(key);
for (int j = 1; j <= data; j++) {
result[i] = key;
i++;
}
}
return result;
}
public static Map<Integer, Integer> getMap(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
if (map.containsKey(num)){
map.put(num, map.get(num) + 1);
} else {
map.put(num, 1);
}
}
return map;
}
}