两个数组的交集
此博客链接:
两个数组的交集
题目链接:
题目
给定两个数组,编写一个函数来计算它们的交集。
示例 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 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
题解
方法一:使用map
先把一个数组的值添加到map中,记录数组中的元素值和对应个数,判断第二个数组中的元素是否在map中,如果在,则取出添加到结果集中,并把map中的value值减一,如果不在,则说明不是两者的交集。
这里有个技巧:把数租少的元素生成键值对,用多的数组去找map中的值。
方法二:使用双指针
定义两个指针分别指向两个数组的头部,判断两个数组中指针所指的元素是否相等,如果相等,则移动双指针,并把元素添加到结果集中,如果那个小,则移动那个指针。
代码
方法一
class Solution { public int[] intersect(int[] nums1, int[] nums2) { Map <Integer,Integer> map=new HashMap<Integer,Integer>(); int len1=nums1.length; int len2=nums2.length; if(len2<len1){ return intersect(nums2,nums1); } for(int nums:nums1 ) { int count=map.getOrDefault(nums,0)+1; map.put(nums,count); } int res[]=new int[len1]; int index=0; for(int nums02:nums2 ) { int count=map.getOrDefault(nums02,0); if(count>0) { res[index++]=nums02; count--; if(count>0) { map.put(nums02,count); } else{ map.remove(nums02); } } } return Arrays.copyOfRange(res, 0, index); } }
方法2
class Solution { public int[] intersect(int[] nums1, int[] nums2) { int len1=nums1.length; int len2=nums2.length; if(len2<len1){ return intersect(nums2,nums1); } Arrays.sort(nums1); Arrays.sort(nums2); int res[]=new int[len1]; int index=0; int left=0; int right=0; while(left<len1&&right<len2) { if(nums1[left]<nums2[right]) { left++; } else if(nums1[left]>nums2[right]) { right++; } else{ res[index++]=nums1[left]; left++; right++; } } return Arrays.copyOfRange(res, 0, index); } }
结果
方法一
方法二
出来混总是要还的