?一、思路
双指针算法
首先:对两个数组进行排序操作,然后开辟集合进行存储。
其次:两个指针同时从数组下标0开始,循环遍历直到某一方到达终点结束。
遍历途中分三种情况:
1、数组1的值小于数组2的值,数组1的指针进行加一操作
2、数组2的值小于数组1的值,数组2的指针进行加一操作
3、当两者数组值相同时判断集合中是否存在如果存在两个指针同时加1,如果不存在则添加到集合中两个指针同时加一操作。
最终:循环从集合取出值存储再数组中
set去重操作
?首先:开辟set集合,通过set对某一数组迭代添加set集合进行去重操作。
其次:开辟新的集合进行存储结果值,然后对另一个数进行遍历,每一个数据与set集合进行比对存在则添加到输出集合中,并删除set集合的值。
最终:集合转换成数组。
二、画图展示:
双指针算法
?
set去重操作
?
?三、代码展示:
双指针算法
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);//先对两个数组进行排序
List<Integer>list = new ArrayList<Integer>();
int l=0,r=0;//l表示数组1的指针,r表示数组2的指针
while(l<nums1.length&&r<nums2.length) {//当某一个数组遍历完循环结束
if(nums1[l]<nums2[r])l++;//当数组1的值小于数组2的值则指针向右加一
else if(nums2[r]<nums1[l])r++;//当数组2的值小于数组1的值则指针向右加一
else if(nums1[l] == nums2[r]) {//当数组相等时判断集合中是否存在如果存在两个指针同时加1
if(list.contains(nums1[l])) {
l++;
r++;
}else {//不存在时添加到集合中两个指针同时加一操作
list.add(nums1[l]);
l++;
r++;
}
}
}
int []num=new int[list.size()];
for(int i=0;i<list.size();i++) {//循环从集合取出值存储再数组中
num[i]=list.get(i);
}
return num;
}
}
set去重操作
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
TreeSet<Integer>set = new TreeSet<>();//通过set对某一数组进行去重操作
for(int num:nums1){
set.add(num);//迭代添加进集合
}
ArrayList<Integer>list = new ArrayList<>();
for(int nums:nums2){//对另一个数进行遍历
if(set.contains(nums)){
//对每一个数据与集合进行比对存在则添加到输出集合中,并删除set集合的值
list.add(nums);
set.remove(nums);
}
}
int[] array = list.stream().mapToInt(Number::intValue).toArray();//集合转换成数组
return array;
}
}
四、题目扩展
?代码展示:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
List<Integer>list = new ArrayList<Integer>();
int l=0,r=0;
while(l<nums1.length&&r<nums2.length) {
if(nums1[l]<nums2[r])l++;
else if(nums2[r]<nums1[l])r++;
else if(nums1[l] == nums2[r]) {
list.add(nums1[l]);
l++;
r++;
}
}
int []num=new int[list.size()];
for(int i=0;i<list.size();i++) {
num[i]=list.get(i);
}
return num;
}
}
|