1. 程式人生 > 實用技巧 >LeetCode 350. 兩個陣列的交集 II

LeetCode 350. 兩個陣列的交集 II

題目連結

350. 兩個陣列的交集 II

題目分析

這個題目要求我們求兩個陣列的交集,那麼我們最簡單的思想就是利用map去做一個快取,然後針對另外一個數組,去檢查快取中是否有這個數,並且這個數出現的次數要大於0,如果大於0,就納入到交集中。
第二種思想就是對兩個陣列進行預處理,把無序變成有序,然後利用雙指標,如果兩者相等,就納入交集,否則就將較小的數的指標往前挪。

程式碼實現

實現一

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums1.length; i++){
            map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1);
        }
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < nums2.length; i++){
            if(map.getOrDefault(nums2[i], 0) != 0){
                list.add(nums2[i]);
                map.put(nums2[i], map.get(nums2[i]) - 1);
            }
        }
        int[] res = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            res[i] = list.get(i);
        }
        return res;
    }
}

實現二

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<>();
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;
        int j = 0;
        while(i < nums1.length && j < nums2.length){
            if(nums1[i] == nums2[j]){
                list.add(nums1[i]);
                i++;
                j++;
            }else if(nums1[i] < nums2[j]){
                i++;
            }else{
                j++;
            }
        }
        int[] res = new int[list.size()];
        for(int k = 0; k < list.size(); k++){
            res[k] = list.get(k);
        }
        return res;
    }
}

總結

一道簡單的題有多種的解法,這對思維的分析十分有用。