03.算法学习之两个数组的交集(进阶)

该题目是我文章《02.算法学习之两个数组的交集》的进阶版,此时把条件设置成两个有序的数组求交集。

题目:给定两个有序的数组,编写一个函数来计算它们的交集。

说明:

1.输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致

2.不考虑输出结果顺序

示例:

输入:num1=[1,2,2,1] , nums2=[2,2]

输出:[2, 2]


我的脑回路: 此时看到题目条件变成了两个有序的数组,此时求他们的交集的话,就是获取两个有序数组中相同元素的集合。那么该怎么获取呢?暴力破解?双重For循环? 不,我们要利用有序这个特性,可以使用两个指针分别指向两个有序数组的头部,以此往后遍历。num1数组的数值大时,num2数组指针加一,同理。所以,我们可以写成如下所示的代码:

public static int[] intersect2(int[] nums1, int[] nums2) {
        int i = 0, j = 0;
        int[] arr = new int[Math.min(nums1.length, nums2.length)];
        int count = 0;
        while ((i < nums1.length) && (j < nums2.length)) {
            if (nums1[i] < nums2[j]) {
                i++;
            } else if (nums1[i] > nums2[j]) {
                j++;
            } else {
                arr[count++] = nums1[i];
                i++;
                j++;
            }
        }
        return Arrays.copyOfRange(arr, 0, count);
    }

以上是个人简介,本人正在学习算法中,如有错误,请各位大佬指教。

原文链接:,转发请注明来源!