标签:ash 输出 一个 部分 假设 turn 无法 特殊 文件的
例如:
给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].
注意:
跟进:
1 public int[] intersect(int[] nums1, int[] nums2) { 2 Map<Integer, Integer> counter = new HashMap<>(); //计数器,key为数组中的数字,value为该数字在数组中出现的次数 3 for (int i = 0; i < nums1.length; i++) { 4 int num = nums1[i]; 5 if (counter.containsKey(num)) { 6 counter.put(num, counter.get(num) + 1); 7 } else { 8 counter.put(num, 1); 9 } 10 } 11 List<Integer> tempList = new ArrayList<>(); 12 for (int i = 0; i < nums2.length; i++) { 13 int num = nums2[i]; 14 if (counter.containsKey(num) && counter.get(num) > 0) { 15 counter.put(num, counter.get(num) - 1); //计数器中记录该数字的次数减1 16 tempList.add(num); //将该数字添加到list中 17 } 18 } 19 int[] result = new int[tempList.size()]; 20 //为满足题目返回值类型,将list转换为int数组 21 for (int i = 0; i < result.length; i++) { 22 result[i] = tempList.get(i); 23 } 24 return result; 25 }
OK,基本功能已经实现,下一步我们一起思考如何满足几个跟进问题:
思路:因为两个数组都是有序的,那我们完全可以用两个指针c1和c2分别顺序扫描两个数组,得到两个数字m和n,有以下三种关系:
1、m == n,则该数字是重复数字,将该数字添加到结果数组中,同时将两个指针分别后移一位。
2、m > n,我们需要将c2指针后移一位。
3、m < n,我们需要将c1指针后移一位。
重复以上步骤,直到c1或c2其中一个指针已移动到数组末端。
代码实现如下:
1 public int[] intersect(int[] nums1, int[] nums2) { 2 int cur1 = 0, cur2 = 0; // 定义指针,指向数组开始位置 3 List<Integer> list = new ArrayList<>(); 4 while (cur1 < nums1.length && cur2 < nums2.length) { // 循环结束条件:任何一个指针指向对应数组的末端 5 int num1 = nums1[cur1]; 6 int num2 = nums2[cur2]; 7 if (num1 == num2) { // 重复数字,加入结果列表中 8 list.add(num1); 9 cur1++; 10 cur2++; 11 } else if (num1 < num2) { // 将cur1指针后移一位,继续下一次比较 12 cur1++; 13 } else { // 将cur2指针后移一位,继续下一次比较 14 cur2++; 15 } 16 } 17 int[] result = new int[list.size()]; 18 // 为满足题目返回值类型,将list转换为int数组 19 for (int i = 0; i < list.size(); i++) { 20 result[i] = list.get(i); 21 } 22 return result; 23 }
如果nums2的元素多到无法一次性加载到内存中,那我们应该:
1、将nums1中的数字初始化计数器。
2、使用缓冲流读取文件的一部分数据,计数器中有记录且记录的次数大于1,将该数字新增到结果数组中,计数器中该数字记录的次数减1,这样完成了这一部分数据的统计。
3、接着再读取文件中下一部分数据,重复步骤2。
OK,以上是这个问题的一些想法,如果朋友们有更好的方式,欢迎留言交流哈~
标签:ash 输出 一个 部分 假设 turn 无法 特殊 文件的
原文地址:https://www.cnblogs.com/zfLee/p/9332552.html