(LeetCode 349) 兩個數組的交集

給定兩個數組,編寫一個函數來計算它們的交集。
示例1:

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

示例 2:

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

說明:

  1. 輸出結果中的每個元素一定是唯一的。
  2. 我們可以不考慮輸出結果的順序。

解法一:

    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();

        // 遍歷獲取交集,Set集合去重
        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                if (nums1[i] == nums2[j]) {
                    set.add(nums1[i]);
                }
            }
        }

        // Set集合轉數組
        int[] a = new int[set.size()];
        int index = 0;
        for (int i : set) {
            a[index++] = i;
        }
        return a;
    }

時間複雜度O(m*n)

解法二:

    public static int[] intersection02(int[] nums1, int[] nums2) {
        // 比較數組大小
        int[] maxNum;
        int[] minNum;
        if (nums1.length > nums2.length) {
            maxNum = nums1;
            minNum = nums2;
        } else {
            maxNum = nums2;
            minNum = nums1;
        }
        // 數組大的轉Set集合,Set集合去重
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < maxNum.length; i++) {
            set.add(maxNum[i]);
        }
        // 遍歷小的數組,取交集
        HashSet<Integer> resultSet = new HashSet<>();
        for (int i = 0; i < minNum.length; i++) {
            if (set.contains(minNum[i])) {
                resultSet.add(minNum[i]);
            }
        }
        // Set集合轉數組
        int[] result = new int[resultSet.size()];
        int i = 0;
        for (int x : resultSet) {
            result[i++] = x;
        }

        return result;
    }

時間複雜度O(m+n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章