力扣(LeetCode) 350. 两个数组的交集 II

仅用于学习记录

题目

图片: 在这里插入图片描述

题解

方法一:排序+双指针
这个方法还是很清晰明了的哦。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
    //对两个数组进行排序,Arrays.sort()默认为升序
    Arrays.sort(nums1);
    Arrays.sort(nums2);
    //为下边的双指针做铺垫
    int a=0,b=0,c=0;
    //设置一个新数组,求交集的结果就存在里边哦
    //数组长度肯定不超过两个数组最短的那个
    int[] nums3 = new int[Math.min(nums1.length,nums2.length)];
    //循环是遍历两个数组,如果有一个遍历完就结束循环
    while(a<nums1.length&&b<nums2.length){
    //比较大小,谁小就后移一位它的指针,因为排过序了,所以不会有遗漏情况
        if(nums1[a]>nums2[b]){
            b++;
        }
        else if(nums1[a]<nums2[b]){
            a++;
        }
        //如果相等那就是我们要找的交集啦,就让nums3的指针后移
        //进而让nums1,nums2的指针都后移,进而找下一个交集元素
        else{
            nums3[c]=nums1[a];
            a++;
            b++;
            c++;
        }

    }
    //Arrays.copyOfRange(int[] original, int from, int to)
    //就是将指定数组的指定范围放到新数组里,从0到c
    return Arrays.copyOfRange(nums3,0,c);
    }
}

时间复杂度:O(mlog m+nlog n)
空间复杂度:O(min(m,n))

方法二:哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

上源百度,不明其意,思索万千,逐渐自闭。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        //将数组长度短的放在前面
        if(nums1.length>nums2.length){
            return intersect(nums2,nums1);
        }
        //创建一个哈希表,第一个参数(此为String) 是对"键"的数据类型的限制,第二个参数是对"值"的数据类型的限制,这里用的都是intersect的类
        //这里Map里面的变量必须是泛型
        Map<Integer , Integer> map = new HashMap<Integer , Integer>();
        //这个循环是1.5开始的写法
        //for(循环变量类型 循环变量名称:要被遍历的对象)
        //遍历第一个数组,记录每个元素出现的个数并存到哈希表中
        for(int num : nums1){
        //第一次是遍历第一个数组,将其所有的数都存到里边并且计数
            int count = map.getOrDefault(num,0)+1;
        //将获取 Map 集合的所有键名,并存放在一个 Set 集合对象中
        //put(K key,V value) key是要保存到Map集合中的键名,value是要保存到Map集合中对应键名的键值对象
            map.put(num , count);
        }
        int[] nums3 = new int[nums1.length];
        int c=0;
        //遍历第二个数组,在哈希表中大于0则记录并删除
        for(int num : nums2){
            int count = map.getOrDefault(num,0);
            if(count > 0){
                nums3[c++]=num;
                count--;
                if(count > 0){
                    map.put(num,count);
                }
                else {
                //就像它的名字一样,移除
                    map.remove(num);
                }
            }
        }
        //同上
        return Arrays.copyOfRange(nums3,0,c);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值