一、题目描述
给定两个数组,编写一个函数来计算它们的交集。例如:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
对于这个问题我想到了两种解法。
二、排序+指针
1、解题思路
(1)首先对两个数组进行排序,然后使用两个指针遍历两个数组。
(2)初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,且该数字不等于结果数组里面前一个元素,将该数字添加到答案,同时将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。
2、具体代码
public class Leet349 {
public static void main(String[] args) {
Leet349 test = new Leet349();
int[] arr = test.intersection(new int[]{4,9,5},new int[]{9,4,9,8,4});
System.out.println(Arrays.toString(arr));
}
public int[] intersection(int[] nums1, int[] nums2) {
//1、先对nums1和nums2进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
//2、创建两个指针,分别指向两个数组的首元素
int index= 0,first = 0,second = 0;
//3、创建数组ans保存结果
int[] ans = new int[nums1.length+ nums2.length];
while (first < nums1.length && second < nums2.length){
if (nums1[first] == nums2[second]){
//需要保证ans里面的元素不重复
if (index == 0 || nums1[first] != nums1[first-1]){
ans[index++] = nums1[first];
}
first++;
second++;
}else if (nums1[first] < nums2[second]) {
first++;
}else {
second++;
}
}
//只返回ans数组里面的交集元素,其余元素不返回
return Arrays.copyOfRange(ans,0,index);
}
}
3、知识点
因为存放结果的ans数组初始化的长度是两个数组长度之和,所以ans数组后面会有很多0.我们需要用到copyOfrange这个方法只输出交集元素。copyOfRange(original,int from,int to)该方法是从original数组的下标from开始赋值,到下标to结束,不包括下标为to的元素。
三、哈希表
1、解题思路
1、创建两个HashSet:set和ans,set存放nums1的元素,ans存放交集。
2、将nums2的元素和set里面元素进行对比,把一样的元素存入ans
3、将HashSet类型转化为int[]类型
2、具体代码
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
/*
349. 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
例如:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
*/
public class Leet349Hash {
public static void main(String[] args) {
Leet349Hash test = new Leet349Hash();
int[] arr = test.intersection(new int[]{4,9,5},new int[]{9,4,9,8,4});
System.out.println(Arrays.toString(arr));
}
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();//set存放nums1的元素
HashSet<Integer> ans = new HashSet<>();//ans存放交集
//把nums1中的元素添加到HashSet中
for (int n:nums1){
set.add(n);
}
//将nums2的元素和set里面元素进行对比,把一样的元素存入ans
for (int m:nums2){
if (set.contains(m)){
ans.add(m);
}
}
//将HashSet类型转化为int[]类型
int[] arr = ans.stream().mapToInt(Integer::intValue).toArray();
return arr;
}
}
3、知识点
因为结果需要的返回值类型是int [],所以需要将HashSet类型转化为int[]类型。虽然Arrays工具类里面有个toArray()方法,但是返回的是Object[]类型,通常使用stream流进行转换。
四、总结
以上就是小赵同学对于这一问题的解法,如果代码有看不明白的地方,欢迎来找我交流讨论哦。