该题目是我文章《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);
}
以上是个人简介,本人正在学习算法中,如有错误,请各位大佬指教。