给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
//时间复杂度O(nlgn),空间复杂度O(n)
方法一
public static Set<Integer> getInterSection(int[] arr1,int[] arr2) {
Arrays.sort(arr1);
Arrays.sort(arr2);
int n=arr1.length;
int m=arr2.length;
Set<Integer> set =new HashSet<Integer>();
int index1=0;
int index2=0;
while(index1<n && index2<m) {
if(arr1[index1]==arr2[index2]) {
set.add(arr1[index1]);
index1++;
index2++;
}else if(arr1[index1]<arr2[index2]) {
index1++;
}else {
index2++;
}
}
return set;
}
方法二:排序 + 双指针
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] intersection = new int[length1 + length2];
int index = 0, index1 = 0, index2 = 0;
while (index1 < length1 && index2 < length2) {
int num1 = nums1[index1], num2 = nums2[index2];
if (num1 == num2) {
// 保证加入元素的唯一性
if (index == 0 || num1 != intersection[index - 1]) {
intersection[index++] = num1;
}
index1++;
index2++;
} else if (num1 < num2) {
index1++;
} else {
index2++;
}
}
return Arrays.copyOfRange(intersection, 0, index);
}
}