题目大意:
两个数组的交集 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-解题思路分析/