LeetCode - 两个数组的交集 II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zlp_zky/article/details/82085830

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

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

   提交结果:

猜你喜欢

转载自blog.csdn.net/zlp_zky/article/details/82085830