LeetCode-349. 兩個陣列的交集
阿新 • • 發佈:2022-04-05
題目來源
題目詳情
給定兩個陣列 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
題解分析
解法一:雙指標
- 本題最直觀的求解方法其實是使用set來去重並取交集,但是這種方法需要引入set這個資料結構,所以顯得比較麻煩。
- 還有另外一種解法是使用雙指標,因為題目要求是要求交集,所謂的交集就是數值相等的元素,所以,我們可以先對陣列進行排序,然後分別設定一個指標來移動兩個陣列的元素,當指標指向的元素相同時則表示這個元素是重複的,將作為結果值存起來。
- 這裡有一個小細節就是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); } }