leetcode 350. 两个数组的交集 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]
 

说明:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

此题和前面一道题(leetcoce 349. 两个数组的交集)一样,用map来记录每个数字出现的次数,遍历第二个数组的时候,来每出现一次数字,value值就-1,直到变为0。

    public int[] intersection(int[] nums1, int[] nums2) {

        if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
            return new int[0];
        }
        int l1 = nums1.length;
        int l2 = nums2.length;

        int[] a;
        int[] b;
        if (l1 > l2) {
            l1 = l2;
            a = nums2;
            b = nums1;
        } else {
            a = nums1;
            b = nums2;
        }

        int size = (l1 << 1) <= 0 ? Integer.MAX_VALUE : (l1 << 1);
        int[] arr = new int[l1];
        Map<Integer, Integer> map = new HashMap<>(size);
        for (int key : a) {
            Integer integer = map.get(key);
            if (integer == null) {
                map.put(key, 1);
            } else {
                map.put(key, integer + 1);
            }
        }
        int i = 0;
        for (int key : b) {
            Integer integer = map.get(key);
            if (integer != null && integer != 0) {
                arr[i++] = key;
                map.put(key, integer - 1);
            }
        }
        if (i == 0) {
            return new int[0];
        }
        return Arrays.copyOfRange(arr, 0, i);
    }

事件复杂度和空间复杂度都是中等。

posted @ 2021-04-18 21:21  旺仔古李  阅读(36)  评论(0编辑  收藏  举报