LeetCode350. 两个数组的交集 II(映射的应用)

350. 两个数组的交集 II

LeetCode第350号问题,题目链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-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]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。

解题思路

不同于第349号问题,每一个元素一定是唯一的,需要使用集合进行数组去重。而这道题中需要记录元素在两个数组中出现的次数,对题的理解即是,在求两个数组的并集时候,需要考虑元素重复出现的情况并返回结果。所以使用映射来对数组进行处理,传入两个Integer,K代表元素,V代表频次。

  1. 对num1进行遍历,如果元素不存在map中,则新增,如果存在,需要记录频次,是元素的value+1;
  2. 遍历num2数组时,判断num2中每一个元素是否存在于映射map中,如果存在,则找到一个并集元素,同时将map中元素的频次-1。如果发现元素的频次-1之后等于0,那么需要将它从映射中删除。如果不存在,说明一定不是并集元素,则什么也不做。

Solution.java

import java.util.ArrayList;
import java.util.TreeMap;

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        // 第一个Interger代表元素,第二个Interger代表出现的频次
        TreeMap<Integer, Integer> map = new TreeMap<>();

        // 对num1数组进行遍历
        for (int n : nums1) {
            // 如果在映射中不包含n,为map中新增元素
            if (!map.containsKey(n))
                map.put(n, 1); // 新增元素频次默认为1
            else // 如果包含,则为n的频次+1
                map.put(n, map.get(n) + 1);
        }

        ArrayList<Integer> list = new ArrayList<>(); // 用于存放交集元素
        // 遍历num2数组处理交集问题
        for (int n : nums2) {
            // 如果包含,则找到了一个交集元素
            if (map.containsKey(n)) {
                list.add(n);
                // 由于映射中存储的是频次,找到一个元素,将频次-1
                map.put(n, map.get(n) - 1);
                // 如果发现n的频次-1之后等于0 则将它从映射中删除
                if (map.get(n) == 0)
                    map.remove(n);
            }
            // 如果不包含,什么也不做,说明一定不是并集元素
        }

        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++)
            res[i] = list.get(i);
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/wankcn/article/details/106506345