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

【LeetCode】349. 兩個陣列的交集

349. 兩個陣列的交集

知識點:set; 雙指標

題目描述

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

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

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

解法一:set

交集,這不就是說的重複嗎?果斷想到set;遍歷一個數組,把不重複的存入set,再遍歷另一個數組,如果set裡有,那就是一個交集,防止多算,把它移除,接著遍歷。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<>();
        Set<Integer> set = new HashSet<>();
        for(Integer i : nums1){
            if(!set.contains(i)) set.add(i);
        }
        for(Integer i : nums2){
            if(set.contains(i)){
                set.remove(i);
                list.add(i);
            }
        }
        return list.stream().mapToInt(Integer::valueOf).toArray();
        //要學會這個list<Integer>轉為int[];此外也可以這樣
        //index = 0;
        //int[] arr = new int[list.size()];
        //for(Integer i : list){
        //   arr[index++] = i;
        //}
        //return arr;
    }
}

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

解法二:排序+雙指標

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

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int length1 = nums1.length, length2 = nums2.length;
        List<Integer> list = new ArrayList<>();
        int index = 0, index1 = 0, index2 = 0;
        while (index1 < length1 && index2 < length2) {
            int num1 = nums1[index1], num2 = nums2[index2];
            if (num1 == num2) {
                // 保證加入元素的唯一性
                if (list.size() == 0 || num1 != list.get(list.size() - 1)) {
                    list.add(num1);
                }
                index1++;
                index2++;
            } else if (num1 < num2) {
                index1++;
            } else {
                index2++;
            }
        }
        int[] arr = new int[list.size()];
        for(Integer i : list){
            arr[index++] = i;
        }
        return arr;
    }
}