两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。

1.先对两个数组进行排序,然后使用两个指针分别指向两个数组的开始位置。
首先判断两个指针指向的值是否相同,相同则是交集,把这个值存到list集合中,若不相同则值小的指针向后移动一位,再判断两个指针指向的值是否相同,以此循环下去,直到其中有一个的指针不能移动为止,最后再把存到list集合中的值转化为数组即可。

public int[] intersect(int[] nums1, int[] nums2) {
	
	//将数组按升序排序
    Arrays.sort(nums1);
    Arrays.sort(nums2);
    int i = 0;
    int j = 0;
    //设置一个集合用来存储相同的元素
    List<Integer> list = new ArrayList<>();
    while(i < nums1.length && j < nums2.length){
        if(nums1[i] > nums2[j]){
            //j指向的值向后移一位
            j++;
        }else if(nums1[i] < nums2[j]){
            //i指向的值向后移一位
            i++;
        }else{
            //i和j指向的值相同,添加到list集合中,i和j各向后移一位
            list.add(nums1[i]);
            i++;
            j++;
        }
    }
    //将list集合中的数据转化为数组
    int[] a = new int[list.size()];
    for(int k = 0;k < list.size();k++){
        a[k] = list.get(k);
    }
    return a;
} 

2.使用map键值对来解决
遍历nums1中的所有元素将他存储在map中,其中key是nums1数组中的元素,value是这个元素在nums1数组中出现的次数。
然后遍历nums2中的元素,如果map中包含nums2中的元素,就把该元素保存在list集合中,然后map中该元素对应的value要减1,最后将list集合转化为数组即可。

public int[] intersect1(int[] nums1, int[] nums2) {
	HashMap<Integer, Integer> map = new HashMap<>();
	ArrayList<Integer> list = new ArrayList<>();
	
	//先把数组nums1的所有元素都存放到map中,其中key是数组中
	//的元素,value是这个元素出现在数组中的次数
	for (int i = 0; i < nums1.length; i++) {
	    /*map.getOrDefault:
	        当Map集合中有这个nums1[i]时,就使用这个key值;
	        如果没有就使用默认值defaultValue。*/
	    map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1);
	}
	
	//然后再遍历nums2数组,查看map中是否包含nums2的元素,如果包含,
	//就把当前值加入到集合list中,然后再把对应的value值减1。
	for (int i = 0; i < nums2.length; i++) {
	    if (map.getOrDefault(nums2[i], 0) > 0) {
	        list.add(nums2[i]);
	        map.put(nums2[i], map.get(nums2[i]) - 1);
	    }
	}
	//把集合list转化为数组
    int[] res = new int[list.size()];
    for (int i = 0; i < list.size(); i++) {
        res[i] = list.get(i);
    }
    return res;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值