因为数组中有重复数字,所以每个重复数字都要看成独立的元素,所以使用map保存一个数组中的结果,key为数组的值,value为出现的次数,这样先遍历一遍构造map,再遍历一遍找map中有没有相同的数
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null){
return null;
}
if (nums1.length == 0 || nums2.length == 0){
return new int[0];
}
HashMap<Integer,Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums2.length; i++){
if (!map.containsKey(nums2[i])){
map.put(nums2[i],1);
}else{
map.put(nums2[i],map.get(nums2[i]) + 1);
}
}
for (int i = 0; i < nums1.length; i++){
if (map.containsKey(nums1[i])){
if (map.get(nums1[i]) != 0){
list.add(nums1[i]);
map.put(nums1[i],map.get(nums1[i]) - 1);
}
}
}
int[] array = new int[list.size()];
int index = 0;
for (Integer i : list){
array[index++] = i;
}
return array;
}
如果先对两个数组排序,再用快慢指针的方法去寻找,会比较快
public int[] intersect(int[] nums1, int[] nums2) {
// 排好序的写法
Arrays.sort(nums1);
Arrays.sort(nums2);
// 定义i,j两个指针,k用于记录交集的索引值
int i = 0, j = 0, k = 0;
while (i < nums1.length && j < nums2.length) {
if(nums1[i] < nums2[j]) {
// 说明num1[i]较小,i右移
i++;
} else if (nums1[i] > nums2[j]) {
// 说明nums2[j]较小,j右移
j++;
} else {
// 两个元素相同,记录在k
nums1[k++] = nums1[i];
// 两个指针向前走一步
i++;
j++;
}
}
return Arrays.copyOfRange(nums1, 0, k);
}