给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
第一种
public static int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums1.length; i++) {
for(int j = 0; j < nums2.length; j++) {
if(nums1[i] == nums2[j]) {
set.add(nums1[i]);
break;
}
}
}
Object[] obj = set.toArray();
int temp[] = new int[obj.length];
for (int i = 0; i < obj.length; i++) {
temp[i] = (int) obj[i];
System.out.print(temp[i] + " ");
}
return temp;
}
利用set集合的性质,set集合中的元素都是唯一的,通过双循环找到相同的数即可,这样比较费时间,但是比较容易理解
第二种:排序+双指针
public static int[] intersection2(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
Set<Integer> set = new HashSet<>();
int i = 0;
int j = 0;
while (i < nums1.length && j < nums2.length) {
if(nums1[i] == nums2[j]) {
set.add(nums1[i]);
i++;
j++;
}else {
if(nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
}
Object[] obj = set.toArray();
int temp[] = new int[obj.length];
for (int k = 0; k < obj.length; k++) {
temp[k] = (int) obj[k];
}
return temp;
}
先对数组进行排序,然后用两个不同的指针分别指向数组的头部,如何两个数组中的元素相同,则将该元素放入到set中,如果不同,就需要将数小的那个指针向后移一位,因为数组是有序的,大的数都在后面,那么想要找到和当前数相同的,就需要指针向后移动。
这个时间效率显而易见