一.问题描述
-
给定两个数组,编写一个函数来计算它们的交集。
-
示例 1:
-
输入:nums1 = [1,2,2,1], nums2 = [2,2]
-
输出:[2,2]
-
进阶:
-
如果给定的数组已经排好序呢?你将如何优化你的算法?
-
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
-
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
二.示例代码
public static void main(String[] args) {
int[] num1 = new int[]{1, 2, 2, 1};
int[] num2 = new int[]{2, 2};
int[] result = twoIntersectSortedNums(num1, num2);
for (int res : result) {
System.out.println(res);
}
}
public static int[] twoIntersectNums(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {
return twoIntersectNums(nums2, nums1);
}
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums1) {
int count = map.getOrDefault(num, 0) + 1;
map.put(num, count);
}
int[] intersection = new int[nums1.length];
int index = 0;
for (int num : nums2) {
int count = map.getOrDefault(num, 0);
if (count > 0) {
intersection[index++] = num;
count--;
if (count > 0) {
map.put(num, count);
} else {
map.remove(num);
}
}
}
return Arrays.copyOfRange(intersection, 0, index);
}
public static int[] twoIntersectSortedNums(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int[] intersection = new int[nums1.length > nums2.length ? nums2.length : nums1.length];
for (int i = 0, j = 0, index = 0; i < nums1.length && j < nums2.length; ) {
if (nums1[i] == nums2[j]) {
intersection[index++] = nums1[i];
i++;
j++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
i++;
}
}
return intersection;
}