lc 349. 两个数组的交集
Description
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution
排序+双指针+set
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set= new HashSet<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i=0,j=0;
List<Integer> res = new ArrayList<>();
while(i<nums1.length&&j<nums2.length){
if(nums1[i]==nums2[j]){
res.add(nums1[i]);
i++;
j++;
}
else if(nums1[i]<nums2[j]){
i++;
}else if(nums1[i]>nums2[j]){
j++;
}
}
int[] fires = new int[res.size()];
for(int k=0;k<fires.length;k++){
fires[k] = res.get(k);
}
for(int k=0;k<fires.length;k++){
if(!set.contains(fires[k]))set.add(fires[k]);
}
int[] arr2 = SetToInt(set);
return arr2;
}
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;
}
}
Solution2
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> hashSet = new HashSet<>();
List<Integer> list = new ArrayList<>();
for(int num:nums1){ //先对一个数组去重后添加到set中
if(!hashSet.contains(num)){
hashSet.add(num);
}
}
for(int num:nums2){
if(hashSet.contains(num)){
if(!list.contains(num)){ //这里的判断是为了避免重复添加相同的数
list.add(num);
}
}
}
//将list转换成int数组
int[] res = new int[list.size()];
for(int i=0;i<list.size();i++){
res[i] = list.get(i);
}
return res;
}
}