这一题和https://blog.csdn.net/chaochen1407/article/details/99679944 其实思路是差不多的,就是加一个counter而已。同样还是两种办法:哈希表做对比统计;排序之后然后两个指针在两个数组类似merge two sorted lists或者merge two sorted arrays那样行走就可以了。
第一种方法:哈希表
public int[] intersect(int[] nums1, int[] nums2) {
HashMap<Integer, Integer> resMap = new HashMap<>();
for (int i : nums1) resMap.put(i, resMap.getOrDefault(i, 0) + 1);
List<Integer> resList = new LinkedList<>();
int cnt = 0;
for (int i : nums2) {
if (resMap.containsKey(i)) {
cnt++;
resList.add(i);
resMap.put(i, resMap.get(i) - 1);
if (resMap.get(i) == 0) resMap.remove(i);
}
}
int[] res = new int[resList.size()];
cnt = 0;
for (int i : resList) {
res[cnt] = i;
cnt++;
}
return res;
}
第二种方法:先排序后双指针merge前进
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int pt1 = 0, pt2 = 0;
List<Integer> resList = new LinkedList<>();
while (pt1 < nums1.length && pt2 < nums2.length) {
if (nums1[pt1] == nums2[pt2]) {
resList.add(nums1[pt1]);
pt1++;
pt2++;
} else if (nums1[pt1] < nums2[pt2]) {
pt1++;
} else {
pt2++;
}
}
int[] res = new int[resList.size()];
int cnt = 0;
for (int i : resList) {
res[cnt] = i;
cnt++;
}
return res;
}
关于follow up 的第一问,实际就是第二段代码。
关于follow up的第二问,可以考虑binary search,如果第二个array比第一个长很多的话。如果能达到O(mlogn)小于O(m + n)的话。
关于follow up的第三问,如果只是不能load num2的话,那就把num1放进哈希表里面,然后一段段的读num2出来进行算法一就好了。