LC 两个数组的交集 II

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC 两个数组的交集 II相关的知识,希望对你有一定的参考价值。

LC 两个数组的交集 II


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

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
  • 我们可以不考虑输出结果的顺序。

【代码1.0】

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int cnt= 0;         //交集元素个数计数
        for (int i = 0; i < nums1.length; i++)
        {
            for (int j = 0; j < nums2.length; j++) {
                if (nums1[i] == nums2[j])
                {
                    nums1[cnt++] = nums2[j];
                    nums2[j] = -1; //将重复的用-1填充
                    break;
                }
            }
        }
        return Arrays.copyOf(nums1,cnt);
    }
}


【代码1.1】

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
           // 0 先排序
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        int cnt= 0;
        int head1 = 0;
        int head2 = 0;
        while (head1 < nums1.length && head2 < nums2.length)
        {
            if (nums1[head1] < nums2[head2])
            {
                //两个指针指向的值不同,指向的值相对小的移一步,相对大不动
                head1++;
            }
            else if (nums1[head1] > nums2[head2])
            {
                head2++;
            }
            else  //nums1[head1] = nums2[head2]
            {
                nums1[cnt++] = nums2[head2];
                head1++;
                head2++;
            }

        }
        return Arrays.copyOf(nums1,cnt);
    }
}

针对一次性数组而言:
就本题而言暂时不用开辟新的存储容器,顺便用传进来的数组进行存储;


进阶:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

以上是关于LC 两个数组的交集 II的主要内容,如果未能解决你的问题,请参考以下文章

力扣算法JS LC [349. 两个数组的交集] LC [202. 快乐数]

算法刷题:LC初级算法

算法刷题:LC初级算法

《LeetCode之每日一题》:51.两个数组的交集 II

题目地址(350. 两个数组的交集 II)

前端与算法 leetcode 350. 两个数组的交集 II