LeetCode—兩個數組的交集(排序去重對比+官方兩種哈希集合)

兩個數組的交集(簡單)

2020年6月19日

題目來源:力扣

在這裏插入圖片描述

解題

  • 排序去重對比

看到題目要求,輸出結果可以無序,就想到了排序

結果又要求唯一,那麼就先去重,這裏去重我使用了雙指針原地去重

最後就是對比,使用循環對比數值,這裏利用了已經排完序的特點,後面的數肯定會越來越大,那後面的數就不用對比前面對比過的數了

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1==null ||nums1.length==0 ||nums2==null ||nums2.length==0) return new int[0];
        int len1=sortdr(nums1);
        int len2=sortdr(nums2);
        int[] nums3=len1<len2 ? new int[len1]:new int[len2];
        int index=0,jb=0;
        for(int i=0;i<len1;i++){
            for(int j=jb;j<len2;j++){
                if(nums1[i]==nums2[j]){
                    nums3[index++]=nums1[i];
                    jb=j;
                    break;
                }
                else if(nums1[i]<nums2[j]){
                    jb=j;
                    break;
                }
            }
        } 
        return Arrays.copyOf(nums3,index);
    }
    public int sortdr(int[] nums){
        Arrays.sort(nums);
        int la=0;
        for(int i=1;i<nums.length;i++){
            if(nums[la]!=nums[i]){
                nums[++la]=nums[i];
            }
        }
        return la+1;
    }
}

在這裏插入圖片描述

  • 哈希集合

哈希表做法還是常規思路

class Solution {
  public int[] set_intersection(HashSet<Integer> set1, HashSet<Integer> set2) {
    int [] output = new int[set1.size()];
    int idx = 0;
    for (Integer s : set1)
      if (set2.contains(s)) output[idx++] = s;

    return Arrays.copyOf(output, idx);
  }

  public int[] intersection(int[] nums1, int[] nums2) {
    HashSet<Integer> set1 = new HashSet<Integer>();
    for (Integer n : nums1) set1.add(n);
    HashSet<Integer> set2 = new HashSet<Integer>();
    for (Integer n : nums2) set2.add(n);

    if (set1.size() < set2.size()) return set_intersection(set1, set2);
    else return set_intersection(set2, set1);
  }
}

在這裏插入圖片描述

官方解法竟然調用API,直接用retainAll()取交集,我原地犯傻。這不是犯規嗎???

class Solution {
  public int[] intersection(int[] nums1, int[] nums2) {
    HashSet<Integer> set1 = new HashSet<Integer>();
    for (Integer n : nums1) set1.add(n);
    HashSet<Integer> set2 = new HashSet<Integer>();
    for (Integer n : nums2) set2.add(n);

    set1.retainAll(set2);

    int [] output = new int[set1.size()];
    int idx = 0;
    for (int s : set1) output[idx++] = s;
    return output;
  }
}

在這裏插入圖片描述

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