标题: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]
提示
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
进阶
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小,哪种方法更优?
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
代码Java
public int[] intersection(int[] nums1, int[] nums2) {
HashMap map1 = new HashMap();
HashMap map2 = new HashMap();
HashMap map3 = new HashMap();
// 把nums1 填装到 map1 k是num v 是出现次数
for (int i = 0; i < nums1.length; i++) {
Object o1 = map1.get(nums1[i]);
if (o1 != null) {
int count = (int) o1 + 1;
map1.put(nums1[i], count);
} else {
map1.put(nums1[i], 1);
}
}
// 把nums2 填装到 map2 k是num v 是出现次数
for (int i = 0; i < nums2.length; i++) {
Object o2 = map2.get(nums2[i]);
if (o2 != null) {
int count = (int) o2 + 1;
map2.put(nums2[i], count);
} else {
map2.put(nums2[i], 1);
}
}
// 遍历nums2的map2 映射 nums1的map1 有相同元素 则放入map3 取v小的元素放入map1
Set set = map2.entrySet();
for (Object o : set) {
Map.Entry entry = (Map.Entry) o;
Object key = entry.getKey();
int k = (int) key;
Object o1 = map1.get(k);
if (o1 != null) {
int x1 = (int) o1;
int x2 = (int) entry.getValue();
if (x1 > x2){
map3.put(k, x2);
} else {
map3.put(k, x1);
}
}
}
// 把map1中的元素放入到 数组中即可
ArrayList<Integer> arrayList = new ArrayList<Integer>();
set = map3.entrySet();
for (Object o : set) {
Map.Entry entry = (Map.Entry) o;
int sum = (int) entry.getValue();
for (int i = 0; i < sum; i++) {
arrayList.add((int)entry.getKey());
}
}
int[] result = new int[arrayList.size()];
for (int i = 0; i < result.length; i++) {
result[i] = arrayList.get(i);
}
return result;
}
// 进阶
public int[] intersection1(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
// 双指针
ArrayList<Integer> arrayList = new ArrayList<Integer>();
int n = nums1.length;
int m = nums2.length;
for (int i = 0, j = 0; i < n && j < m;) {
if (nums1[i] == nums2[j]) {
arrayList.add(nums1[i]);
i ++;
j ++;
} else if (nums1[i] > nums2[j]) {
j ++;
} else {
i++;
}
}
int[] result = new int[arrayList.size()];
for (int i = 0; i < result.length; i++) {
result[i] = arrayList.get(i);
}
return result;
}