leetcode 之 350. 两个数组的交集 II

110 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

一 描述

350. 两个数组的交集 II

给你两个整数数组 nums1nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

 

示例 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 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000  

进阶:

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

二 分析

采用Two Pointers(双指针)的思想。首先对两个数组进行排序

再用两个int变量i、j分别指向两个数组的下标

从0开始同时进行扫描,直到任意一个数组完成扫描,退出循环

循环过程中,若i、j指向的两个数组元素相同,则将其添加进结果数组中

否则,将指向较小元素的变量加一,即指向所在数组的下一个元素继续进行比较

循环往复,最终得到结果数组

三 答案

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i=0,j=0;
        int len=nums1.length;
        if(nums2.length<nums1.length)
            len=nums2.length;
        int[] aux=new int[len];
        int idx=0;
        while(i<nums1.length && j<nums2.length)
        {
            if(nums1[i]==nums2[j])
            {
                aux[idx++]=nums1[i++];
                j++;
            }
            else if(nums1[i]<nums2[j])
                i++;
            else
                j++;
        }
        int[] output=new int[idx];
        for(int k=0;k<idx;k++)
            output[k]=aux[k];
        return output;
    }
}

参考

【双指针】两个数组的交集 II - 两个数组的交集 II - 力扣(LeetCode)

【track & traning】思路简单,性能高效接近100 - 两个数组的交集 II - 力扣(LeetCode)