题目来源

349. 两个数组的交集

题目详情

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 1:

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

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
解释: [4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

题解分析

解法一:双指针

  1. 本题最直观的求解方法其实是使用set来去重并取交集,但是这种方法需要引入set这个数据结构,所以显得比较麻烦。
  2. 还有另外一种解法是使用双指针,因为题目要求是要求交集,所谓的交集就是数值相等的元素,所以,我们可以先对数组进行排序,然后分别设置一个指针来移动两个数组的元素,当指针指向的元素相同时则表示这个元素是重复的,将作为结果值存起来。
  3. 这里有一个小细节就是Arrays.copyOf数组的使用,这是比较容易搞混的,因为System.arraycopy也是用于拷贝数组的,它们之间的最大区别就是,Arrays.copyOf底层也是调用的System.arraycopy这个方法,而且Arrays.copyOf是返回一个新的数组,而System.arraycopy是传入新数组作为参数。
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int n = nums1.length;
        int m = nums2.length;
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int ptr1 = 0, ptr2 = 0;
        int num1, num2;
        int[] result = new int[Math.min(n, m)];
        int index = 0;
        while(ptr1 < n && ptr2 < m){
            num1 = nums1[ptr1];
            num2 = nums2[ptr2];
            if(num1 < num2){
                ptr1++;
            }else if(num1 > num2){
                ptr2++;
            }else{
                ptr1++;
                ptr2++;
                if(index > 0 && num1 == result[index-1]){
                    continue;
                }
                result[index++] = num1;
            }
        }
        return Arrays.copyOf(result, index);
    }
}