今天的这篇page针对的时leetcode上的349.两个数组的交集写的,小尼首先简单说明一下这道题的要求,给点两个数组nums1和nums2.,返回他们的交集,输出结果中的每个元素一定是唯一的。
首先小尼先说第一种方法,第一种方法就是暴力法,我们先观察这个题目给出的条件,它给出的时两个数组,先说说小尼最开始的思路,小尼最开始的思路是创建第三个数组,然后两层for循环对着两个数组进行遍历,然后把所有相等的数据放入我创建的第三个数组中,在最这个方法进行去重,首先这个思路确实可以,但是最大的问题就是时间复杂度过高,而且不容易写对,所以小尼针对这个方法做了一个改进,那就是利用指针进行去重,小尼接下来拉一下代码
int k = 0;
int a = num1.length;
int b = num2.length;
int []num = new int[num1.length + num2.length];
Arrays.sort(nums1);
Arrays.sort(nums2);
int index1 = 0 , index2 = 0;
while(index1 < a && index2 < b ){
if(nums1[index1] == nums2[index2]){
if(index1 == 0 || num[index-1] != nums[index1]){
num[k++] = nums1[index1];
index1++;
index2++;
}
else if(nums1[index1] > nums2[index2]){
index2++;
}
else{
index1++;
}
}
return Arrays.copyOfRange(num,0,k);
}
小尼先来解释一下这里面的思路啊,首先我们运用Arrays.sort()的方法对两个数组进行排序,这也是今天小尼学到的新的知识,Arrays.sort()可以对数组进行排序(切记啊,一定是针对数组,如果是字符串,可以通过tocharArray()的方法将字符串转换成数组再去排序),然后我们定义了两个指针index1、index2,我们也创建了一个新的数组以便于我们放入参数,接下来我们定义的条件是index1<a && index2 < b,这个条件其实就是遍历结束的条件,我们在遍历的过程中不要只知道for循环的遍历,while循环的遍历我们同样也需要知道,然后当我们在两个数组中遍历到了相等的值的时候,我们这里的去重操作就是将遍历到的这个数与我们第三个数组的上一个放入的数进行比较,如果已经有了我们就不再放入,如果没有我们就放入,如果两个数组遍历的数值不相等我们就将另一个数组的指针继续往后遍历就行了。最后小尼解释一下最后一句话的意思return Arrays.copyOfRange(num,0,k); 这里的copyOfRange()方法的作用是复制num中的从0到k的左闭右开的区间的值,这里我们的放入的k值因为最后加了个一,所以我们肯定是取不到的,所以我们运用这种方法非常好用。
接下来,小尼给大家介绍第二种方方法,也是今天小尼学习的重点,就是运用哈希表的set方法进行操作,小尼先给大家说明一下set方法运用好处,其实好处就是set内部的add方法具有去重的功能,小尼先拉一下代码:
if(nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0) return new int[0];
HashSet<Integer> set1 = new HashSet<>();
HashSet<Integer> set2 = new HashSet<>();
for(int i : nums1){
set1.add(i);
}
for(int i : nums2){
if(set1.contains(i)){
set2.add(i);
}
}
int []s = new int[];
int arr = 0;
for(int i : set2){
s[arr++] = i;
}
return s;
这里小尼给大家说一下这里面的思想,首先我们先写出没有元素或者数组的个数为0的情况,返回的就是全部为0的一个数组,然后我们创建两个Hashset,我们的第一个set1是用来遍历我们的第一个数组,我们的set2是真正放入我们所需结果的Hashset,我们先遍历将第一个数组中的元素放入我们的set1中,然后遍历第二个数组,判断set1中是否包含nums2中的元素,如果包含就返给set2中,这个里面的去重就是add的源码实现的,所以我们得到的新的set2中就不会有重复的元素。最后我们一定要注意一点就是我们的set2是一个set结构并不是一个数组,但是我们需要返回的是一个数组,所以我们就再走一个for遍历将数据放入新创建的数组中,最后再返回。
小尼给大家再拉一个代码
if(nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0) return new int[0];
HashSet<Integer> set1 = new HashSet<>();
HashSet<Integer> set2 = new HashSet<>();
for(int i : nums1){
set1.add(i);
}
for(int i : nums2){
if(!set1.contains(i)){
set1.add(i);
}
}
return set2.stream().mapToInt(i->i).toAr;
最后这句话是的作用可以直接将set形式的数据转化为数组,有兴趣的小伙伴可以记住!!!!
本文介绍了如何使用暴力法和改进版的指针法解决LeetCode 349题,同时探讨了利用哈希表(Set)进行去重的高效解决方案。通过Arrays.sort()排序数组并结合Set的特性简化交集查找过程。
247

被折叠的 条评论
为什么被折叠?



