LeetCode350 兩個數組的交集(重複元素不跳過大量元素如何處理)

兩個數組的交集(重複元素)
在這裏插入圖片描述
在這裏插入圖片描述

  • 可以採用349那樣,先對數組進行排序,然後使用雙指針,遍歷數組,進行判斷

 //誰小誰就加速跑,一樣大兩個就要都往前
    //排序+雙索引法
    public int[] intersect(int[] nums1, int[] nums2) {

        Arrays.sort(nums1);
        Arrays.sort(nums2);

        List<Integer> list = new ArrayList<>();

        int nums1Index = 0;
        int nums2Index = 0;

        while (nums1Index<nums1.length&&nums2Index<nums2.length){

            if(nums1[nums1Index]==nums2[nums2Index]){
                list.add(nums1[nums1Index]);
                nums1Index++;
                nums2Index++;
            }else if(nums1[nums1Index]<nums2[nums2Index]){
                nums1Index++;
            }else{
                nums2Index++;
            }

        }

        int[] rs = new int[list.size()];

        for(int i=0;i<rs.length;i++){
            rs[i]=list.get(i);
        }

        return rs;
    }
  • 如果nums2的元素存儲在磁盤上,磁盤內存是有限的,並且不能一次加載所有的元素到內存中,使用HashMap來跟蹤每個數字出現的次數,檢查數組的大小並對較小的數組進行哈希映射是一個小細節,當其中一個數組較大時,會減小內存使用。

  //如果nums2的元素存儲在磁盤上,磁盤內存是有限的,
    // 並且不能一次加載所有的元素到內存中
    //使用HashMap來跟蹤每個數字出現的次數
    //檢查數組的大小並對較小的數組進行哈希映射是一個小細節,
    // 當其中一個數組較大時,會減少內存的使用。
    public int[] intersect2(int[] nums1, int[] nums2){

        //計算每個key以及key出現的次數
            Map<Integer,Integer> map = new HashMap<>();
            for(Integer i:nums1){
                int count = 0;
                if(map.containsKey(i)){
                    count=map.get(i);
                }
                count++;
                map.put(i,count);
            }


         List<Integer> list = new ArrayList<>();
            for(Integer i:nums2){
                int cnt = map.getOrDefault(i,0);
                if(cnt>0){
                    list.add(i);
                    map.put(i,cnt-1);
                }
            }

        int[] rs = new int[list.size()];
            for(int i=0;i<list.size();i++) rs[i]=list.get(i);

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