小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
leetcode350-两个数组的交集
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
给定两个数组,编写一个函数来计算它们的交集。
- 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2]
- 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9]
说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。 我们可以不考虑输出结果的顺序。
解题思路分析
方案1 双指针
本方案的思路主要是通过两个指针对数组进行同步遍历。首先对两个数组进行排序,排序后就可以直接从小到大进行遍历。两个数组在循环中同时向前遍历推进,由数组指针分别表示当前的遍历位置。当两个数组当前的数据不相等时,则对较小的指针向前推进。如果两个数组的数据相等,则将其记录在结果数组中作为二者的交集。此方案可以显著降低对于两个数组的循环次数。 代码如下:
int length1 = nums1.length;
int length2 = nums2.length;
int length = length1 > length2 ? length2 : length1;
int[] result = new int[length];
int index = 0;
int index1 = 0;
int index2 = 0;
Arrays.sort(nums1);
Arrays.sort(nums2);
while(index1 < length1 && index2 < length2){
if(nums1[index1] < nums2[index2]){
index1++;
}else if(nums1[index1] > nums2[index2]){
index2++;
}else{
result[index] = nums1[index1];
index1++;
index2++;
index++;
}
}
return Arrays.copyOfRange(result,0,index);
复杂度分析
- 时间复杂度 o(m+n)
- 空间复杂度 o(m+n)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。