leetcode 350. Intersection of Two Arrays II
来源:互联网 发布:油皮保湿水 知乎 编辑:程序博客网 时间:2024/06/04 20:13
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2, 2]
.
Note:
- Each element in the result should appear as many times as it shows in both arrays.
- The result can be in any order.
Follow up:
- What if the given array is already sorted? How would you optimize your algorithm?
- What if nums1's size is small compared to nums2's size? Which algorithm is better?
- What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
package leetcode;import java.util.ArrayList;import java.util.HashMap;public class Intersection_of_Two_Arrays_II_350 {public int[] intersect(int[] nums1, int[] nums2) {ArrayList<Integer> intersect=new ArrayList<Integer>();HashMap<Integer, Integer> map=new HashMap<Integer, Integer>();for(int i=0;i<nums1.length;i++){int count=map.getOrDefault(nums1[i], 0);count++;map.put(nums1[i], count);}for(int i=0;i<nums2.length;i++){int count=map.getOrDefault(nums2[i], 0);if(count==0){continue;}else{count--;intersect.add(nums2[i]);map.put(nums2[i], count);}}int[] result=new int[intersect.size()];for(int i=0;i<intersect.size();i++){result[i]=intersect.get(i);}return result;}public static void main(String[] args) {// TODO Auto-generated method stubIntersection_of_Two_Arrays_II_350 i=new Intersection_of_Two_Arrays_II_350();int[] nums1=new int[]{1,2,2,1};int[] nums2=new int[]{2,2};int[] result=i.intersect(nums1, nums2);for(int j=0;j<result.length;j++){System.out.print(result[j]+" ");}}}至于后续的这个问题,大神也想出了解决办法:
- What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
2. 如果nums1和nums2都太大了以至于不能被内存所容纳,那么将它们分别排序 (external sort),然后每次分别从两个数组中各拿出一个元素放入内存中,来比较取交集。
有大神继续讨论:谢谢你的解法,但是我觉得2不太可行,因为如果你一次仅仅从磁盘中取2个元素,而磁盘读取十分耗时,所以这个过程将花费很多时间。原则上我们应该在运行时最小化磁盘读取次数。
一个可取的改进方案是:我们先使用外部排序将它们分别排序,如果内存是4G,那么我们就分别从这两个数组中取出2G放入内存,使用 2 pointer 方法来找交集,这部分完成后,再分别读2G入内存,重复直到磁盘上再也没有更多数据了。
另一个大神说:在面试中这样的问题是考验答题者是否了解一些数据工程技术。我从一个数据工程师的角度,觉得有三种思路来解决这个问题:
1. 将这2个数组存储在分布式系统中,然后使用MapReduce技术来解决问题
2. 分块处理这2个数组,(块fit内存),然后每一次处理一个块数据。
3. 流式处理数组,然后核查。
对于external sort的技术,这篇文章里有介绍:http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L17-ExternalSortEX2.htm
阅读全文
0 0
- LeetCode 350. Intersection of Two Arrays II
- leetcode.350. Intersection of Two Arrays II
- [leetcode] 350. Intersection of Two Arrays II
- Leetcode 350. Intersection of Two Arrays II
- leetcode 350. Intersection of Two Arrays II
- Leetcode 350. Intersection of Two Arrays II
- [leetcode] 350. Intersection of Two Arrays II
- leetcode 350. Intersection of Two Arrays II
- 【leetcode】350. Intersection of Two Arrays II
- [Leetcode] 350. Intersection of Two Arrays II
- 【leetcode】350. Intersection of Two Arrays II
- LeetCode 350. Intersection of Two Arrays II
- LeetCode - 350. Intersection of Two Arrays II
- LeetCode 350. Intersection of Two Arrays II
- leetcode 350. Intersection of Two Arrays II
- leetcode-350. Intersection of Two Arrays II
- leetcode 350. Intersection of Two Arrays II
- [leetcode]350. Intersection of Two Arrays II
- 【脚本语言系列】关于Python基础知识对象自省,你需要知道的事
- Halcon实战记录之三《模板制作--两点定位》
- 单列模式
- mysql event 定时更新任务
- 装双系统后,在windows下修复linux
- leetcode 350. Intersection of Two Arrays II
- node不可逆加密和可逆加密的简单实例 crypto模块
- exit异常终止
- JAVA使用RC4解密C#的RC4密文问题
- java中List转数组的问题
- I
- 微信小程序开发常用技巧(2)——页面view高度计算
- 学习日记-ps文字位置固定,但内容可以修改
- [每日翻译]如何在c#里面创造一个excel文件