给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
- 我们可以不考虑输出结果的顺序。
进阶:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map.Entry;
public class Solution350 {
public int[] intersect(int[] nums1, int[] nums2) {
ArrayList<Integer> a = new ArrayList<Integer>();
HashMap<Integer, Integer> hm1 = new HashMap<Integer, Integer>();
HashMap<Integer, Integer> hm2 = new HashMap<Integer, Integer>();
for (int i = 0; i < nums1.length; i++) {
if (hm1.containsKey(nums1[i])) {
hm1.put(nums1[i], hm1.get(nums1[i]) + 1);
} else {
hm1.put(nums1[i], 1);
}
}
for (int i = 0; i < nums2.length; i++) {
if (hm2.containsKey(nums2[i])) {
hm2.put(nums2[i], hm2.get(nums2[i]) + 1);
} else {
hm2.put(nums2[i], 1);
}
}
int min = 0;
for (Entry<Integer, Integer> set : hm1.entrySet()) {
min = set.getValue() < hm2.getOrDefault(set.getKey(), 0) ? set.getValue()
: hm2.getOrDefault(set.getKey(), 0);
if (min > 0) {
for (int i = 0; i < min; i++) {
a.add(set.getKey());
}
}
}
int[] out = new int[a.size()];
for (int i = 0; i < a.size(); i++) {
out[i] = a.get(i);
}
return out;
}
public static void main(String[] args) {
Solution350 s = new Solution350();
int[] nums1 = { 4, 9, 5 };
int[] nums2 = { 9, 4, 9, 8, 4 };
System.out.println(Arrays.toString(s.intersect(nums1, nums2)));
}
}