Leetcode350 兩個陣列的交集 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]
說明:
- 輸出結果中每個元素出現的次數,應與元素在兩個陣列中出現的次數一致。
- 我們可以不考慮輸出結果的順序。
進階:
- 如果給定的陣列已經排好序呢?你將如何優化你的演算法?
- 如果 nums1 的大小比 nums2 小很多,哪種方法更優?
- 如果 nums2 的元素儲存在磁碟上,磁碟記憶體是有限的,並且你不能一次載入所有的元素到記憶體中,你該怎麼辦?
解法一:
用map建立nums1的字元與字元出現對應次數的一一對應關係。新建動態陣列list儲存map中包含有nums2中的元素,也就是交集的元素。當map中包含nums2中的元素,把它放到list中,並將map的value減一,如果map.get(num)==0,則將num的key移除,最後將list轉換為int陣列。
java程式碼如下:
import java.util.ArrayList; class Solution { public int[] intersect(int[] nums1, int[] nums2) { //利用map建立字元和出現字元次數之間的對映 Map<Integer,Integer> map=new HashMap<Integer,Integer>(); for(int num:nums1){ if(!map.containsKey(num)){ map.put(num,1); }else{ map.put(num,map.get(num)+1); } } //動態陣列儲存交集的元素 List<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型別陣列 int res[]=new int[list.size()]; for(int i=0;i<list.size();i++){ res[i]=list.get(i); } return res; } }