给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [4,9]
说明:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
进阶:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
解法:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int re[]=new int[0];
if(nums1.length==0||nums2.length==0) return re; //边缘检测,如果两个数组至少一个为空,则返回空集;
Arrays.sort(nums1); Arrays.sort(nums2); //先将数组排序,便于求解
if(nums1[nums1.length-1]<nums2[0]||nums2[nums2.length-1]<nums1[0]) return re;; //如果其中一个数组的最大值小于另一个数组的最小值,返回空集;
int A[]=new int[nums1.length]; //先将交集存入A中,size为空集的大小;
int index=0;int size=0;
for(int i=0;i<nums2.length&&index<nums1.length;){ //index为nums1的指针,i为nums2的指针;
if(nums1[index]==nums2[i]) {A[size]=nums1[index];size++;index++;i++;} //如果当前两个元素相同,则加入交集集合,并同时后移指针
else if(nums1[index]<nums2[i]) index++; //如果当前的nums1的元素小于nums2的元素,则后移nums1的指针
else if(nums1[index]>nums2[i]) i++; //与前述同理;
}
int B[]=new int[size]; //将交集结果存入B,并返回;
for(int i=0;i<size;i++){
B[i]=A[i];
}
return B;
}
}
提交结果: