问题如下:
给定两个数组,写一个方法来计算它们的交集。 例如: 给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2]. 注意: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 我们可以不考虑输出结果的顺序。 跟进: 如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
自己的解法:
class Solution { public int[] intersect(int[] nums1, int[] nums2) { HashMap<Integer,Integer> hashMap = new HashMap<>(); ArrayList<Integer> result = new ArrayList<>(); if (nums1.length > 0){ for (int i =0;i<=nums1.length-1;i++){ Integer temp = hashMap.get(nums1[i]); if (temp == null){ hashMap.put(nums1[i],1); }else { hashMap.put(nums1[i],temp+1); } } for(int j=0;j<=nums2.length-1;j++){ Integer temp = hashMap.get(nums2[j]); if (temp != null){ result.add(nums2[j]); if (temp> 1){ hashMap.put(nums2[j],temp-1); }else { hashMap.remove(nums2[j]); } } } } Integer[] integers = new Integer[result.size()]; result.toArray(integers); int tmpInt[] = new int[result.size()]; for (int i = 0; i < integers.length; i++) { tmpInt[i] = integers[i]; } return tmpInt; } }
思路: 1.先遍历数组1,将数组的每一项存入一个hashMap,如果一个元素出现多次则hashmap的value+1
2.遍历数组2,判断当前元素在hashmap中是否存在,如果存在就将这个元素加入到result中
3.判断当前元素的value,如果大于1则减1,否则将这个元素的key从hash中移除,
4.最终得到的就是所求的两个数组重复的部分
leet给的最优解
class Solution { public int[] intersect(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; int len = len1 > len2 ? len2 : len1; Arrays.sort(nums1); Arrays.sort(nums2); int[] nums = new int[len]; int k = 0; int curr1, curr2 = 0; for(int i = 0, j = 0; i < len1 && j < len2;) { curr1 = nums1[i]; curr2 = nums2[j]; if(curr1 == curr2) { nums[k] = curr1; k += 1; i += 1; j += 1; } else if(curr1 < curr2) { i += 1; } else { j += 1; } } return Arrays.copyOfRange(nums, 0, k); } }
尝试理解一下思路:
1.找到两个数组中相对较短的哪一个
2.对两个数组进行排序
3.从0开始遍历两个数组,判断当前遍历到的数组1和数组2元素是否相等,如果相等表示两个数组重复的部分开始,将这个元素放在返回数组中指示标志k所在的位置然后k+1
4.遍历玩两个数组后对返回数组进行截取,得到重复部分的数组