1. 程式人生 > >leetcode筆記_集合和對映的使用及比較 (集合的元素去重,對映的元素頻次記錄)

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]

說明:

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

思路:利用集合的去重特點

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        
        //通過set對nums1去重
        TreeSet<Integer> set = new TreeSet<>();
        for(int num: nums1){
            set.add(num);
        }
        
        //判斷set中是否包含nums2中的元素,若包含則記錄下來,並在set中刪除此元素,防止重複記錄nums2中的重複元素
        ArrayList<Integer> list = new ArrayList<>();
        for(int num: nums2){
            if(set.contains(num)){
                list.add(num);
                set.remove(num);  //注意,這裡的移除操作,是為了防止nums2中的重複元素被包含進來
            }
        }
        
        //題目要求返回陣列
        int[] arr = new int[list.size()];
        for(int i=0; i<arr.length; i++){
            arr[i] = list.get(i);
        }
              
        return arr;
    }
}

350. 兩個陣列的交集 II

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

示例 1:

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

示例 2:

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

說明:

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

思路:使用對映實現元素頻次的記錄

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        
        //通過Map記錄nums1中出現的元素,以及每個元素出現的次數,K記錄出現的元素,V記錄該元素出現的次數
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for(int num:nums1){
            if(!map.containsKey(num)){
                map.put(num, 1);
            }else{
                map.put(num, map.get(num)+1);
            }
        }
        
        
        //判斷map中是否包含nums2的元素,若包含,則記錄此元素,並將對應元素的次數減一,減為0時,則從map中刪除此元素
        ArrayList<Integer> list = new ArrayList<>();
        for(int num:nums2){
            if(map.containsKey(num)){
                list.add(num);
                map.put(num, map.get(num)-1);
                if(map.get(num) == 0){
                    map.remove(num);
                }
            }
        }
        
        //題目要求返回陣列
        int[] arr = new int[list.size()];
        for(int i=0; i<arr.length; i++){
            arr[i] = list.get(i);
        }
        
        return arr;
    }
}