做法基本两种
- 一是用java的set来做
- 二是用排序+二分/双指针来做
实现2
排好序了,可以比较下两个数组的最大值,最小值,看看是否有解,在大量数据的时候可以剪枝。
int max1,max2,min1,min2;
if(nums1.length==0||nums2.length==0) return new int[0];
max1=nums1[nums1.length-1];//看到长度-1,考虑是否越界
min1=nums1[0];
max2=nums2[nums2.length-1];
min2=nums2[0];
if(max1<min2||min1>max2) return new int[0];
双指针
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums2);
Arrays.sort(nums1);
int[] ans=new int[nums2.length];
int cot=0;
int j=0;
int i=0;
while(i!=nums1.length){
if(j==nums2.length) break;
if(nums1[i]==nums2[j]){
j++;
if(cot>=1&&nums1[i]==ans[cot-1]){
i++;
continue;
}
ans[cot++]=nums1[i];
}else if(nums1[i]>nums2[j]) j++;
else if(nums1[i]<nums2[j]) i++;
}
return Arrays.copyOf(ans,cot);
}
}
二分
两个数组已经排序了,可以用二分了。
无非是遍历一个数组,在另一个数组中二分。
实现1
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> s1=new HashSet<>();
Set<Integer> s2=new HashSet<>();
for(Integer am:nums1) {
s1.add(am);
}
for(Integer am:nums2) s2.add(am);
int size=Math.max(s1.size(),s2.size());
int[] ans=new int[size];
int index=0;
for(Integer am:s1){
if(s2.contains(am)){
ans[index++]=am;
}
}
return Arrays.copyOf(ans,index);
}
}