问题描述
给定两个数组,编写一个函数来计算它们的交集。
思路
1. 遍历一个数组,用HashSet存储,遍历另一个数组,然后判断前一个有没有。时间复杂度O(2n),空间复杂度O(n)。不行,反例[1,2][2,2],遍历顺序不对的话,会有问题。
2. 遍历一个数组,用map存储数字和出现次数,然后遍历另一个数组,有相同数字的减1直到0,将相同数字放到list中,最后将list转为数组。
2. 暴力法:遍历一个数组,遍历另一个数组看有没有,O(n2)。空间复杂度O(n)。应该有问题,数量可能不对。
3. 暴力法改良:排序一个数组,然后遍历另一个数组,双指针。时间复杂度O(nlogn)。碰到相同的,两个指针都后移,两个不同,小的后移。
刚开始想到了第一种思路,试了几次,没对发现有问题。后面看了下之前自己做的记录,发现用的是第二种思路,看时间是去年做的,时间久远,都忘了。水平还有待提高。
代码
实现了第二种思路
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map1 = new HashMap<>();
List<Integer> list = new ArrayList<>();
for (int num : nums1) {
if (map1.containsKey(num)) {
map1.put(num, map1.get(num) + 1);
} else {
map1.put(num, 1);
}
}
for (int num : nums2) {
if (map1.containsKey(num) && map1.get(num) != 0) {
map1.put(num, map1.get(num) - 1);
list.add(num);
}
}
int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}