【算法训练】LeetCode#350 两个数组的交集 II

一、描述

350. 两个数组的交集 II

给你两个整数数组 nums1nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

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

示例 2:

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

二、思路

最简单的方法还是,逐个数组遍历,并每个数字出现次数,然后再遍历map构建数组。

不过这样无论时间还是空间复杂度都很差。

在v1基础上,v2可以只用一个map,第二次遍历时在map上做减法并记录公共数字。

三、解题


public class LeetCode350 {
    public static int[] intersect(int[] nums1, int[] nums2) {
        HashMap<Integer,Integer> map01 = new HashMap<>();
        HashMap<Integer,Integer> map02 = new HashMap<>();
        HashMap<Integer,Integer> map03 = new HashMap<>();
        int n1 = nums1.length;
        int n2 = nums2.length;
        for (int value : nums1) {
            if (map01.containsKey(value)){
                map01.put(value,map01.get(value)+1);
            }else{
                map01.put(value,1);
            }
            // 出现过则+1,否则赋值1
        }
        for (int value : nums2) {
            if (map02.containsKey(value)){
                map02.put(value,map02.get(value)+1);
            }else{
                map02.put(value,1);
            }
            // 出现过则+1,否则赋值1
        }

        int n = 0;
        for (Map.Entry<Integer, Integer> entry: map02.entrySet()){
            // 遍历
            if (map01.containsKey(entry.getKey()) && map02.containsKey(entry.getKey())){
                // 如果同时存在
                int len = Math.min(map01.get(entry.getKey()),map02.get(entry.getKey())); // 计算最小个数
                map03.put(entry.getKey(),len);
                n += len;
            }
        }
        int[] ans = new int[n];
        int loc = 0;
        for (Map.Entry<Integer, Integer> entry: map03.entrySet()){
            int insertNum = entry.getKey();
            int length = map03.get(insertNum);
            for (int i = 0 ; i < length ; i++){
                ans[loc++] = insertNum;
            }
        }
        return ans;

    }

    public static int[] intersectV2(int[] nums1, int[] nums2) {
        HashMap<Integer,Integer> map = new HashMap<>();
        int n1 = nums1.length;
        int n2 = nums2.length;
        for (int value : nums1) {
            if (map.containsKey(value)){
                map.put(value,map.get(value)+1);
            }else{
                map.put(value,1);
            }
            // 出现过则+1,否则赋值1
        }
        int[] ans = new int[n1+n2];
        int loc = 0;
        for (int value : nums2) {
            if (map.containsKey(value)){
                int count = map.get(value);
                if (count > 0){
                    map.put(value,--count);
                    ans[loc++] = value;
                }
            }
        }

        // 拷贝0到loc
        return Arrays.copyOfRange(ans,0,loc);
    }
    
    public static void main(String[] args) {
        int[] nums1 = new int[]{4,9,5};
        int[] nums2 = new int[]{9,4,9,8,4};
        System.out.println(Arrays.toString(intersect(nums1, nums2)));
    }
}
posted @ 2023-02-07 18:09  小拳头呀  阅读(9)  评论(0编辑  收藏  举报