leetcoce 349. 两个数组的交集

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

 

示例 1:

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

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

说明:

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

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

采用map(用其中长度短的来,可以减少内存)来记录其中一个数组,之后遍历另一个数组,看其中是否有此数字。注意的是第二个数组中是否有重复的数字,需要去重。

    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) {
            map.putIfAbsent(key, 1);
        }
        int i = 0;
        for (int key : b) {
            Integer integer = map.get(key);
            if (integer != null && integer == 1) {
                arr[i++] = key;
                // 去重准备
                map.put(key, 2);
            }
        }
        if (i == 0) {
            return new int[0];
        }
        return Arrays.copyOfRange(arr, 0, i);
    }

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

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