数据结构与算法两个数组的交集Ⅱ

题目描述:

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序

解题方法一:双指针法 (解题方法参考leetcode作者:demigodliu)

先行将数组排序,方便我们查找:

1、创建一个指针 i指向 nums1 数组首位,指针 j指向 nums2 数组首位。
2、创建一个临时栈,用于存放结果集。
3、开始比较指针 i和指针 j 的值大小,若两个值不等,则数字小的指针,往右移一位。
4、若指针 i 和指针 j 的值相等,则将交集压入栈。
5、若 nums 或 nums2 有一方遍历结束,代表另一方的剩余值,都是唯一存在,且不会与之产生交集的。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        
        //双指针
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        int length1 = nums1.length;
        int length2 = nums2.length;

        int[] nums3 = new int[Math.min(length1,length2)];

        int index1=0,index2=0,index3=0;
        while(index1<length1 && index2<length2){

            if(nums1[index1] < nums2[index2]){
                index1++;
            }else if(nums1[index1] > nums2[index2]){
                index2++;
            }else if(nums1[index1] == nums2[index2]){
                nums3[index3] = nums1[index1];
                index1++;
                index2++;
                index3++;
            }
            
        }

        return Arrays.copyOfRange(nums3,0,index3);


    }
}

运行结果:

解题方法二:标记法

 1、先将两个数组进行长度判断,设置一个布尔数组(长度为两个数组中长的那一方的长度),全部值设置为true

2、然后进行遍历,将重复出现位置的值换成false

3、然后根据false的索引值对长的那一方的数组进行赋值到新的数组即可得到交集

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int[] c;
        int[] d;
        Boolean[] booleans;
        if (nums1.length>=nums2.length){
            c=nums1;
            d=nums2;
        }else {
            c=nums2;
            d=nums1;
        }
        booleans=new Boolean[c.length];
        for (int i = 0; i < booleans.length; i++) {

            booleans[i]=true;
        }
        int sum=0;
        for (int i = 0; i < d.length; i++) {
            for (int j = 0; j < c.length; j++) {
                if (booleans[j].booleanValue()){
                    if (d[i]==c[j]){
                        booleans[j]=false;
                        sum++;
                        break;
                    }
                }
            }
        }
        int[] ints = new int[sum];
        int index=0;
        for (int i = 0; i < booleans.length; i++) {
            if (!booleans[i]){
                ints[index]=c[i];
                index++;
            }
        }


        return ints;


    }
}

提交结果:

解法三:

1、先将两个数组进行判断,nums1强制 成 长的数组,nums2为短的数组,新建nums3记录两个数组的交集,交集小于或等于nums2

2、将nums1数组进行遍历放入hashMap中,key记录数组元素,value记录出现次数

3、遍历查找map中是否有nums2中的元素,若有且当出现次数大于0的时候赋给nums3,然后出现次数减一

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int[] nums3;
        if (nums1.length>=nums2.length){
            nums3 = new int[nums2.length];
        }else {
            nums3 = new int[nums1.length];
            int[] a=nums1;
            nums1 = nums2;
            nums2 = a;
        }
        HashMap<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            if (map.containsKey(nums1[i])){
                map.put(nums1[i],map.get(nums1[i])+1);
            }else {
                map.put(nums1[i],1);
            }
        }
        int index=0;
        for (int i = 0; i < nums2.length; i++) {
            if (map.containsKey(nums2[i])){
                if (map.get(nums2[i])>0){
                    nums3[index]=nums2[i];
                    index++;
                    map.put(nums2[i],map.get(nums2[i])-1);
                }
            }
        }
        return Arrays.copyOfRange(nums3,0,index);
    
    }
}

运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值