1. 程式人生 > 其它 >LeetCode-349. 兩個陣列的交集

LeetCode-349. 兩個陣列的交集

題目來源

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);
    }
}