DAY 34 leetcode 349--哈希表.两个数组的交集

发布于:2025-04-03 ⋅ 阅读:(11) ⋅ 点赞:(0)

题号349

我尝试硬解失败

/*class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int n1=nums1.length;
        int n2=nums2.length;
        int size=Math.min(n1,n2);
        int []arr=new int[size];
        
        int count=0;
        for(int i=0;i<n1;i++){
            outerloop:
            for(int j=0;j<n2;j++){
                if(nums1[i]==nums2[j]){
                    for(int k=0;k<count;k++){
                        if(nums1[i]==arr[k])
                        break outerloop;
                    }
                    arr[count]=nums1[i];
                    count++;
                    break;
                }
            }
        }
        return arr;
    }
}*/

因为返回的数组会带有默认的0无法消除

另解:使用哈希集合

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int n1=nums1.length;
        int n2=nums2.length;
        //创建哈希集合
        Set <Integer> set1=new HashSet<Integer>();
        Set <Integer> set2=new HashSet<Integer>();
        for(int num:nums1){
            set1.add(num);
        }
        for(int num:nums2){
            set2.add(num);
        }
        return getIntersection(set1,set2);
    }
    public int [] getIntersection(Set<Integer>set1,Set<Integer>set2){
        //保证set1是较小的集合
        if(set1.size()>set2.size())
        return getIntersection(set2,set1);
        Set <Integer> newSet=new HashSet <Integer>();
        for(int num:set1){
            if(set2.contains(num))//自带的函数
            newSet.add(num);
        }
        //创建一个数组便于返回
        int []arr=new int[newSet.size()];
        int count=0;
        for(int num:newSet){
            arr[count++]=num;
        }
        return arr;
    }
}

再另解:改进我的解法

我的解法之所以失败是因为数组长度固定,默认值会导致错误,而Java中可以用列表数据类型来代替,其长度可变,最后返回时再转为数组即可

而可以改进的地方在于,这种解法,先用哈希集合把set1元素记录,然后再遍历set2,如果发现有相同元素则在哈希集合中把该值删除,并加入列表中。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        
        Set <Integer> set=new HashSet <Integer>();
        for(int num:nums1){
            set.add(num);
        }
        List <Integer>list=new ArrayList<>();
        for(int num:nums2){
            if(set.remove(num))//有 则顺手删除
            list.add(num);
        }
        //将列表转为数组
        int []arr=new int[list.size()];
        int count=0;
        for(int num:list){
            arr[count++]=num;
        }
        return arr;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到