X

LEETCODE 350. Intersection of Two Arrays II 解题思路分析

题目大意:

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

说明:

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

进阶:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=350

解题思路分析:

我们先循环一遍第一个数组,使用一个Map,统计出每种数字出现的次数,其中key为该数字,value是该数字出现的次数。然后再遍历一遍第二个数组,如果当前数字在map中出现次数大于0,说明数组1中也存在该数字,此时,当前数字即是交集的一员,将它加入返回结果,同时将map中该数字出现次数减一。循环完第二个数组之后,也就统计出了所有交集部分。

实现代码:

public int[] intersect(int[] nums1, int[] nums2) {
    Map<Integer,Integer> map=new HashMap<>();
    // 统计数组1中每个数字出现的次数
    for(int n : nums1){
        map.put(n,map.getOrDefault(n,0)+1);
    }
    // 交集部分
    List<Integer> list = new ArrayList<>();
    // 循环第二个数组
    for(int n:nums2){
        // 查看当前数字在map中的个数
        int count=map.getOrDefault(n,0);
        // 如果个数大于0,说明数组1中也包含该数字
        if(count>0){
            // 将该数字加入交集集合
            list.add(n);
            // 同时将该数字出现次数减一
            map.put(n,count-1);
        }
    }
    // 将list转为数组返回
    int[] res = new int[list.size()];
    for(int i=0;i<list.size();i++){
        res[i]=list.get(i);
    }
    return res;
}

本题解法执行时间为3ms。

Runtime: 3 ms, faster than 61.54% of Java online submissions for Intersection of Two Arrays II.

Memory Usage: 39.3 MB, less than 6.45% of Java online submissions for Intersection of Two Arrays II.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-350-intersection-of-two-arrays-ii-解题思路分析/
Categories: leetcode
kwantong: