题目描述:
Given two arrays, write a function to compute their intersection.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [9,4]
Note:
- Each element in the result must be unique.
- The result can be in any order.
思路1:空间换时间 时间复杂度o(n),空间复杂度o(n)
我们建立一个容器,如HashMap或者HashSet,将num1中的元素放入哈希表中,这样我们再遍历第二个数组的时候,如果哈希表中包含这个元素,则将这个元素加入结果集。因为结果集中的元素必须是唯一的,因此我们可以选用Hashset,保证数据的唯一性。
实现:
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set=new HashSet<>();
HashSet<Integer> ret=new HashSet<>();
for(Integer ele:nums1){
set.add(ele);
}
for(Integer ele:nums2){
if(set.contains(ele)){
ret.add(ele);
}
}
int[] rett=new int[ret.size()];
int i=0;
for(Integer ele:ret){
rett[i++]=ele;
}
return rett;
}
思路2:双指针法(时间复杂度o(nlogn))
我们可以对两个数组进行排序,排序后分别用指针p1,p2指向num1,num2,如果p1指向的数和p2指向的数相等,我们就将这个数加入结果集,如果不相等,若p1指向小于p2指向,则p1向后移动一位,否则,p2向后移动一位,直到两个数组中有一个数组遍历完,就退出循环。
实现:
public int[] intersection2(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int p1=0,p2=0;
HashSet<Integer> set=new HashSet<>();
while(p1<nums1.length&&p2<nums2.length){
if(nums1[p1]<nums2[p2]){
p1++;
}else if(nums1[p1]>nums2[p2]){
p2++;
}else {
set.add(nums1[p1]);
p1++;
p2++;
}
}
int[] ret=new int[set.size()];
int i=0;
for(Integer ele:set){
ret[i++]=ele;
}
return ret;
}
思路三、利用二分查找
我们可以将nums2进行排序,然后遍历nums1中的每一个元素,利用二分查找的方法在nums2中查找nums1中的每个元素,若找到,则加入结果集。
实现:
private int[] intersection3(int[] nums1, int[] nums2) {
HashSet<Integer> set=new HashSet<>();
Arrays.sort(nums2);
for(Integer ele:nums1){
if(binarySearch(nums2,ele)){
set.add(ele);
}
}
int[] ret=new int[set.size()];
int i=0;
for(Integer ele:set){
ret[i++]=ele;
}
return ret;
}
private boolean binarySearch(int[] num,int target){
int low=0;
int high=num.length-1;
while(low<=high){
int mid=(low+high)/2;
if(target==num[mid]){
return true;
}else if(num[mid]<target){
low=mid+1;
}else {
high=mid-1;
}
}
return false;
}