题目要求
给定两个数组nums1和nums2,请你以数组的形式返回两个数组的交集,返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致。
解题思路
①因为要对两个数组的重复元素进行提取,所以采用双指针遍历的方法,分别对两个数组进行遍历,同时对遍历的两个数组元素进行大小的比较;
②在遍历两个数组之前,首先将两个数组进行排序,目的是让双指针遍历更加有效。
③在最后将重复的元素存入新的数组当中,并将新的数组返回给test方法。
图解
代码
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class LeetCode350JiaoJiTest {
@Test
public void test() {
int[] num1 = {1, 2, 3, 4, 5, 6, 100};
int[] num2 = {6, 5, 8, 9, 0, 100};
// 用一个新的数组来接收构造方法返回的数组
int[] num3 = intersect(num1, num2);
System.out.println(Arrays.toString(num3));
}
public int[] intersect(int []nums1,int[]nums2){
// 对两个数组进行排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0 ;
int j = 0 ;
// 创建一个list,用于存储新生成的数组
List<Integer> list = new ArrayList<>();
// 当遍历第一个数组没有索引越界,且遍历第二个数组没有发生索引越界的情况下
while(i<nums1.length&&j<nums2.length){
// 如果第一个数组的第一个元素小于第二个数组的第一个元素,则第一个数组的的指针向后移动一个单位
if(nums1[i]<nums2[j]){
i++;
// 同理,如果第一个数组的第一个元素大于第二个数组的第一个元素,则第二个数组的的指针向后移动一个单位
} else if (nums1[i] > nums2[j]) {
j++;
}else{
// 如果两个数组的元素相同,则把相同的元素存入新的list集合当中,并把第一个数组和第二个数组的指针都向后移动一个单位
list.add(nums1[i]);
i++;
j++;
}
}
// 定义一个新的数组索引
int index = 0;
// 创建一个新的数组
int []res = new int[list.size()];
for (int k = 0; k < list.size(); k++) {
// 进行两个数组交集元素的存储
res[index++] = list.get(k);
}
// 返回新生成的数组
return res;
}
}
代码结果如下
以上就是小编对本道力扣题的思路,还有一部分代码展示,之后小编会新建LeetCode专栏,目前只能做到每周一更