leetcode筆記_集合和對映的使用及比較 (集合的元素去重,對映的元素頻次記錄)
阿新 • • 發佈:2018-12-22
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; } }