1.题目描述
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。
输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
2.解题思路及代码
- 方法一:哈希表法
思路:利用哈希表(不包含重复元素的特点)
1,先将一个数组放入set集合,然后遍历另一个数组。
2,如果第一个set集合包含第二数组元素,则放入结果set1集合中。
3,最后在将set1集合转化为int数组。
4,将set集合中的元素转化为数组输出。
具体代码如下:
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set=new HashSet<>();
Set<Integer> set1=new HashSet<>();
for (int i = 0; i <nums1.length ; i++) {
if (!set.contains(nums1[i])){
set.add(nums1[i]);
}
}
for (int j=0;j<nums2.length;j++){
if (set.contains(nums2[j])){
if (!set1.contains(nums2[j])){
set1.add(nums2[j]);
}
}
}
int[] result=SetToInt(set1);
return result;
}
private static int[] SetToInt(Set<Integer> allSet) {
// 先将set集合转为Integer型数组
Integer[] temp = allSet.toArray(new Integer[] {});//关键语句
// 再将Integer型数组转为int型数组
int[] intArray = new int[temp.length];
for (int i = 0; i < temp.length; i++) {
intArray[i] = temp[i].intValue();
}
return intArray;
}
时间复杂度:O(n)
空间复杂度:O(n)
- 方法二:排序+双指针
思路:
1,首先对两个数组进行排序
2,然后利用两个指针分别指向排序后的两个数组的起始0
3,最后,比较对应元素的大小,来移动相应的指针,其中需要判断是否已经加过相同元素的操作,只需要取前一个元素比较即可。
具体代码如下:
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);
}
时间复杂度:O(nlogn)
空间复杂度:O(logn)
题目链接:https://leetcode-cn.com/problems/intersection-of-two-arrays/