1. 程式人生 > 其它 >【LeetCode】350. 兩個陣列的交集 II

【LeetCode】350. 兩個陣列的交集 II

350. 兩個陣列的交集 II

知識點:雜湊表; 雙指標

題目描述

給定兩個陣列,編寫一個函式來計算它們的交集。

說明:

輸出結果中每個元素出現的次數,應與元素在兩個陣列中出現次數的最小值一致。
我們可以不考慮輸出結果的順序。

進階:

如果給定的陣列已經排好序呢?你將如何優化你的演算法?
如果nums1的大小比nums2小很多,哪種方法更優?
如果nums2的元素儲存在磁碟上,記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?

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

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

解法一:雜湊表

這道題和349題的區別就在於這是真的交集,包括已經重複的,所以就不能用set了。又是涉及到次數的,所以我們可以用雜湊表來做:統計nums1並記錄其出現的次數在雜湊表中,遍歷nums2,如果出現了那就加入list,並且其次數要-1;如果其次數 < 0,即使還是有也不加了。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        for(Integer num : nums1){
            map.put(num, map.getOrDefault(num, 0)+1);
        }
        for(Integer num : nums2){
            if (map.getOrDefault(num, 0) > 0){
                list.add(num);
                map.put(num,map.get(num)-1);
            }
        }
        int index = 0;
        int[] arr = new int[list.size()];
        for(Integer m : list){
            arr[index++] = m;
        }
        return arr;
    }
}

時間複雜度:O(N+M);

解法二:排序+雙指標

和349題一樣,只不過不用判斷了,只要兩個一樣就加入。先將兩個陣列排序,這樣兩個陣列都是從小到大了,然後使用兩個指標同時遍歷這兩個陣列,如果兩個指標指的元素相等就是交集加入list,如果兩個指標指的值不等,則移動較小的元素,接著比較。直到有一個指標走到了頭。其實就是維持了一個從小到大的順序。這樣方便比較

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int index1 = 0, index2 = 0;
        int index = 0;
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        List<Integer> list = new ArrayList<>();
        while (index1 < nums1.length && index2 < nums2.length){
            if (nums1[index1] == nums2[index2]){
                list.add(nums1[index1]);
                index1++;
                index2++;
            }else if(nums1[index1] < nums2[index2]){
                index1++;
            }else{
                index2++;
            }
        }
        int[] arr = new int[list.size()];
        for(Integer m : list){
            arr[index++] = m;
        }
        return arr;
    }
}