1. 程式人生 > >Leetcode350 兩個陣列的交集 II

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;     } }