350.两个数组的交集 II——学习笔记

发布时间 2023-04-12 22:27:55作者: 会飞的笨笨

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

示例 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 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

题目来源:力扣(LeetCode)链接

题解

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        //map1和map2用来存放两个数组中的元素和对应的个数
        Map<Integer, Integer> map1 = new HashMap<>();
        Map<Integer, Integer> map2 = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            map1.put(nums1[i], map1.getOrDefault(nums1[i], 0) + 1);
        }
        for (int i = 0; i < nums2.length; i++) {
            map2.put(nums2[i], map2.getOrDefault(nums2[i], 0) + 1);
        }
        //取出数组num1中的所有元素
        Set<Integer> keys = map1.keySet();
        //存放交集中的元素
        List<Integer> list = new ArrayList<>();
        for (Integer key :  keys) {
            int count = 0;
            //判断是否存在交集,如果存在考虑取出现次数较小的
            if (map2.containsKey(key)) {
                count = Math.min(map1.get(key), map2.get(key));
            }
            //存放交集中的所有元素
            for (int i = 0; i < count; i++) {
                list.add(key);
            }
        }
        //把结果存放到数组返回
        int[] res = new int[list.size()];
        int j = 0;
        for (Integer i : list) {
            res[j++] = i;
        }
        return res;
    }
}