Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2]
.
Note:
- Each element in the result must be unique.
- The result can be in any order.
本题解法比较多,先来说一说我的解法:1.将两个数组进行排序,然后创建两个指针对这两个数组进行遍历,(假设指针为i,j),如果nums1[i]<nums2[j],那么i++;如果nums1[i]>nums2[j],那么j++;否则如果两个值相等,则将其值放入hashset里面,代码如下:
1 public class Solution { 2 public int[] intersection(int[] nums1, int[] nums2) { 3 Set<Integer> set = new HashSet<Integer>(); 4 if(nums1==null||nums1.length==0||nums2==null||nums2.length==0) return new int[0]; 5 Arrays.sort(nums1); 6 Arrays.sort(nums2); 7 int i=0; 8 int j=0; 9 while(i!=nums1.length&&j!=nums2.length){ 10 if(nums1[i]<nums2[j]){ 11 i++; 12 }else if(nums1[i]>nums2[j]){ 13 j++; 14 }else{ 15 // System.out.println(nums1[i]); 16 set.add(nums1[i]); 17 i++; 18 j++; 19 } 20 } 21 int[] res= new int[set.size()]; 22 int q = 0; 23 for(int k:set){ 24 res[q++]=k; 25 } 26 return res; 27 } 28 }
上述代码的时间复杂度为O(nlongn);
第二种方法与之前的Repeated DNA Sequence比较类似,都是创建两个hashset,第一个来保存第一个数组的元素,然后检测是否第二个数组包括第一个数组里面元素,
如果包括,则把它放入第二个hashset里面。他和DNAsequence有个不同之处在于,DNA的第二个hashset用来剔除掉第三次出现的情况;这种双hashset的问题可以用来解决字符重复性的问题,代码如下:
1 public class Solution { 2 public int[] intersection(int[] nums1, int[] nums2) { 3 Set<Integer> set = new HashSet<Integer>(); 4 Set<Integer> res = new HashSet<Integer>(); 5 for(int i:nums1){ 6 set.add(i); 7 } 8 for(int i:nums2){ 9 if(set.contains(i)){ 10 res.add(i); 11 } 12 } 13 int[] result = new int[res.size()]; 14 int k =0; 15 for(Integer i:res){ 16 result[k++] = i; 17 } 18 return result; 19 } 20 } 21 // run time complexity is O(max(nums1.length,nums2.length)) space complexity O(min(nums1.length,nums2.length))
上述方法的时间复杂度是O(n);
第三种方法就是使用二分查找法,对其中的一个数组进行排序,遍历另外一个数组,对另外一个数组的每个num都进行查找,如果找到了,则说明这两个数组都含有这个值,将其放入hashset里面,否则则不包含,代码如下:
1 public class Solution { 2 public int[] intersection(int[] nums1, int[] nums2) { 3 Set<Integer> set = new HashSet<Integer>(); 4 Arrays.sort(nums2); 5 for(int i:nums1){ 6 if(binarySearch(nums2,i)){ 7 set.add(i); 8 } 9 } 10 int[] res = new int[set.size()]; 11 int v = 0; 12 for(int i:set){ 13 res[v++] = i; 14 } 15 return res; 16 } 17 public boolean binarySearch(int[] nums,int target){ 18 int i=0; 19 int j = nums.length-1; 20 while(i<=j){ 21 int mid = i+(j-i)/2; 22 if(nums[mid]==target) return true; 23 else if(nums[mid]<target) i = mid+1; 24 else j = mid-1; 25 } 26 return false; 27 } 28 }