LeetCode350. 两个数组的交集 II(java)

该博客主要解析LeetCode第350题的Java解决方案,通过代码演示如何找到两个数组的交集。内容包括问题描述、示例解析以及两种不同的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定两个数组,编写一个函数来计算它们的交集。
在这里插入图片描述

示例:
在这里插入图片描述
代码:

  • 解法一
//利用映射实现
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        TreeMap<Integer,Integer> map=new TreeMap<Integer,Integer>();
        for(int nums:nums1){	//nums1的键,值放入map中
            if(!map.containsKey(nums)){	//不存在时,值为1
                map.put(nums,1);
            }else{	//存在时 值为当前值+1
                map.put(nums,map.get(nums)+1);
            }
        }
        ArrayList<Integer> list=new ArrayList<Integer>();
        for(int nums:nums2){
            if(map.containsKey(nums)){	//map中有交集元素时
                list.add(nums);	//将元素加入到list中
                map.put(nums,map.get(nums)-1);  //将其值-1
                if(map.get(nums)==0){   //值为0 则map中没有这个键 删除键
                    map.remove(nums);
                }
            }
        }
        int[] res=new int[list.size()];
        for(int i=0;i<list.size();i++){
            res[i]=list.get(i);
        }
        return res;
    }
}
  • 别人的代码
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int i=0,j=0;
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int minle=nums1.length<nums2.length?nums1.length:nums2.length;
        int[] res=new int[minle];
        int k=0;
       while( i < nums1. length && j < nums2. length)        {
             if(nums1[i] == nums2[j]){	//如果相等 将元素加入res中
                res[k++] = nums1[i++];
                j++;	//j++ 更新步长 为什么不i++ j++因为有可能出现元素重复出现的情况
                
            }else{
                if(nums1[i] > nums2[j]){	//因为数组是排序过的 j++
                    j++;
                }
                else{	//排过序 i--
                    i++;
                }
            }
            
        }
        return Arrays.copyOfRange(res,0,k); 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值