leetcode350_两个数组的交集 II_简单

该博客主要介绍了LeetCode第350题的解决方案,通过两种方法求解两个已排序数组的交集:1) 使用双指针技巧;2) 利用HashMap存储并过滤重复元素。在使用双指针方法时需要注意避免多余的0。在HashMap方法中,博主指出了常见的错误和正确返回交集的方式。
摘要由CSDN通过智能技术生成

题目

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

思路

1. 排好序后,双指针

注意点:Arrays.copyOfRange(res, 0, index);,要不然后面有多余的0

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        
        // 排好序,双指针
        // int l1 = 0, l2 = 0; 
        int len1 = nums1.length, len2 = nums2.length;
        int[] res = len1 < len2 ? new int[len1] : new int[len2];
        
        if(nums1 == null || nums2 == null) return res;

        Arrays.sort(nums1);
        Arrays.sort(nums2);

        int l1 = 0, l2 = 0, index = 0;

        while(l1 < nums1.length && l2 < nums2.length) {
            if(nums1[l1] == nums2[l2]) {
                res[index++] = nums1[l1];
                l1++;
                l2++;
            }
            else if(nums1[l1] < nums2[l2]) l1++;
            else l2++; 
        }
        return Arrays.copyOfRange(res, 0, index);
    }
}

2. HashMap

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        // if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) return new int[];

        int[] res;

        res = nums1.length < nums2.length ? help(nums1, nums2) : help(nums2, nums1);

        return res;
    } 

    private int[] help(int[] smallArray, int[] bigArray) {
        int[] res = new int[smallArray.length];
        int index = 0;
        Map<Integer, Integer> map = new HashMap<>(smallArray.length);
        for(int num : smallArray) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        for(int num : bigArray) {
            int number = map.getOrDefault(num, 0);
            if(number > 0) {
                res[index++] = num;
                map.put(num, --number);
            }
        }
        return Arrays.copyOfRange(res, 0, index);
    }
}

出错点:

错误:

	for(int num : bigArray) {
		int number = map.get(num);   // 如果map没有num, number会是null
		if(number != 0) {			 // 那么这里会出NonePointerException
			res[index++] = num;	     // 而且也不能是number != 0, 如果number为负数呢?应该明确条件
			map.put(num, --number);
		}
	}

正确:

 for(int num : bigArray) {
        int number = map.getOrDefault(num, 0);
        if(number > 0) {
            res[index++] = num;
            map.put(num, --number);
        }
}

return Arrays.copyOfRange(res, 0, index);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值