方法一:哈希表+遍历
public int[] intersection(int[] nums1, int[] nums2) {
HashMap<Integer,Boolean> map=new HashMap<>();
List<Integer> res=new ArrayList<>();
for(int i=0;i<nums1.length;i++){
map.put(nums1[i],true);
}
for(int i=0;i<nums2.length;i++){
if(map.containsKey(nums2[i])&&map.get(nums2[i])){
res.add(nums2[i]);
map.put(nums2[i],false);
}
}
int[] arr=new int[res.size()];
for(int i=0;i<res.size();i++) {
arr[i]=res.get(i);
}
return arr;
}
将重复元素的boolean值赋为false,是为了当下次再遍历到这个元素时欺骗它另个数组里没有这个元素。
方法二:快速排序+二分查找
public int[] intersection(int[] nums1, int[] nums2) {
int len1=nums1.length;
int len2=nums2.length;
HashSet<Integer> set=new HashSet<>();
if(len1<len2) {
sort(nums2,0,len2-1);
for(int i=0;i<len1;i++){
int index=search(nums2,nums1[i]);
if(index!=-1){
set.add(nums2[index]);
}
}
}
else {
sort(nums1,0,len1-1);
for(int i=0;i<len2;i++){
int index=search(nums1,nums2[i]);
if(index!=-1){
set.add(nums1[index]);
}
}
}
int index=0;
int[] res=new int[set.size()];
Iterator<Integer> it = set.iterator();
while(it.hasNext()){
res[index++]=it.next();
}
return res;
}
private void sort(int[] nums,int left,int right){
if(left>=right) return;
int l=left;
int r=right;
int target=nums[left];
while(l<r){
while(l<r&&nums[r]>=target) r--;
nums[l]=nums[r];
while(l<r&&nums[l]<=target) l++;
nums[r]=nums[l];
}
nums[l]=target;
sort(nums,left,l-1);
sort(nums,l+1,right);
}
private int search(int[] nums,int target){
int l=0;
int r=nums.length-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]<target) l=mid+1;
else r=mid-1;
}
return -1;
}