两个数组的交集II

120 阅读2分钟

题目要求

给定两个数组nums1和nums2,请你以数组的形式返回两个数组的交集,返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致。

image.png

解题思路

①因为要对两个数组的重复元素进行提取,所以采用双指针遍历的方法,分别对两个数组进行遍历,同时对遍历的两个数组元素进行大小的比较;

②在遍历两个数组之前,首先将两个数组进行排序,目的是让双指针遍历更加有效。

③在最后将重复的元素存入新的数组当中,并将新的数组返回给test方法。

图解

两个数组的交集II(1).png

两个数组的交集(2).png

代码


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;
    }
}


代码结果如下

image.png

以上就是小编对本道力扣题的思路,还有一部分代码展示,之后小编会新建LeetCode专栏,目前只能做到每周一更