初级算法-06两个数组的交集II

75 阅读1分钟

题目

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

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

双指针

先将数组从小到大排好序,用i遍历整数数组nums1,用j遍历整数数组nums2。

当nums1[i]与nums[j]相等时证明两个数组中均含有这个元素,此刻将这个数存入结果数组nums中,接着继续遍历i+1和j+1,如果两个元素还相等,则继续将其存入结果数组nums中。

当nums1[i]<nums2[j]时,要紧接着遍历nums1数组的i+1元素,因为数组是按照从小到大排列的,所以i+1是有可能与nums2[j]相等的,所以此刻应该i自增加一。

当nums1[i]>nums2[j]时,要紧接着遍历nums2数组的j+1元素,因为数组是按照从小到大排列的,所以j+1是有可能与nums1[i]相等的,所以此刻应该j自增加一

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        //将数组排好序
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        //创建一个数组用来存储结果
        int min=0;
        if(nums1.length<nums2.length){
             min = nums1.length;
        }else{
             min=nums2.length;
        }
        int[] nums = new int[min];
        //遍历数组
        int i=0,j=0;
        int k=0;
        while(i<nums1.length&&j<nums2.length){
            if(nums1[i]==nums2[j]){
                nums[k]=nums1[i];
                i++;
                j++;
                
                k++;
            }else if(nums1[i]>nums2[j]){
                j++;
            }else{
                i++;
            }
        }
        //返回结果
        return Arrays.copyOfRange(nums,0,k);
    }
}