难度:easy
1、题目介绍
2、思路分析
第一种方法:双指针法
先对俩个数组进行排序,使用俩个指针 i 和 j 不停遍历nums1和nums2,比较俩个元素的值,如果相等就增加到结果集中,如果 nums1[ i ] < nums2 [ j ] ,将 i 后移一位继续比较,如果 nums1[ i ] > nums2 [ j ] , 将 j 后移一位。最终将结果集转换成数组
代码:
//第一种方法:双指针法
public static int[] intersect(int[] nums1, int[] nums2) {
int i = 0;
int j = 0;
List<Integer> rets = new ArrayList<>();
//对数组进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
while (i < nums1.length && j < nums2.length) {
if (nums1[i] == nums2[j]) {
//如果相等。加入到结果集中
rets.add(nums1[i]);
i++;
j++;
} else if (nums1[i] > nums2[j]) {
//不相等,将小的向后移
j++;
} else {
i++;
}
}
//将rets转换成数组
int[] arr = new int[rets.size()];
for (int k = 0; k < rets.size(); k++) {
arr[k] = rets.get(k);
}
return arr;
}
else if (nums1[i] > nums2[j]) : 这里写 if 是不行的,当 i 和 j 共同后移之后,还会执行i++
第二种方法:哈希表
1、先遍历nums1的数组,将数组中的元素保存在map集合的key中,value保存元素出现的次数
2、遍历nums2数组,判断nums2中的元素是否在nums1中出现过
(1)如果出现过,将这个元素保存到结果集中,并将出现次数-1
3、最终将结果集转换成数组
代码:
//第二种方法:哈希表
public static int[] intersect1(int[] nums1,int[] nums2){
HashMap<Integer,Integer> hashMap = new HashMap<>();
//保存结果集
List<Integer> rets = new ArrayList<>();
//遍历nums1
for (int num:nums1) {
hashMap.put(num,hashMap.getOrDefault(num,0)+1);
}
//遍历nums2
for (int num:nums2) {
if (hashMap.getOrDefault(num,0) > 0){
//出现过,将元素保存到结果集中,并将hashMap中元素出现的次数-1
rets.add(num);
hashMap.put(num,hashMap.getOrDefault(num,0)-1);
}
}
//将rets转换成数组
int[] arr = new int[rets.size()];
for (int i = 0; i < rets.size(); i++) {
arr[i] = rets.get(i);
}
return arr ;
hashMap.getOrDefault():这个函数的作用是检查 HashMap 是否存在特定的键 key。
如果存在key返回key所对应的value
如果不存在则返回默认值,也就是后面写的 0
举例说明:
// 创建一个 HashMap
HashMap<Integer, String> sites = new HashMap<>();
sites.put(1, "Google");
sites.put(2, "Runoob");
sites.put(3, "Taobao");
// key 的映射存在于 HashMap 中
String value1 = sites.getOrDefault(1, "Not Found");
System.out.println("Value for key 1: " + value1);
// key 的映射不存在于 HashMap 中
// 如果 HashMap 中没有该 key,则返回默认值 Not Found
String value2 = sites.getOrDefault(4, "Not Found");
System.out.println("Value for key 4: " + value2);
输出结果:
当题目中需要多次查询数据的时候可以考虑使用哈希表来解决方法