算法一、暴力破解法,遍历两个数组,比较值。借用第三个数组来装载相同的值。时间复杂度为O(n).
public static int[] intersect(int[] arr1,int[] arr2){
int N=0;
if(arr1.length>arr2.length){
N=arr2.length;
}else{
N=arr1.length;
}
int[] n=new int[N];
int k=0;
for(int i=0;i<arr1.length;i++){
for(int j=0;j<arr2.length;j++){
if(arr1[i]==arr2[j]){
n[k++]=arr1[i];
}
}
}
n= Arrays.copyOf(n,k);
return n;
}
算法二:指针法。
先排序,然后定义两个指针
时间复杂度为O(nlogn),空间复杂度O(1)
public class Intersect {
public static int[] intersect(int[] arr1,int[] arr2){
int N=0;
if(arr1.length>arr2.length){
N=arr2.length;
}else{
N=arr1.length;
}
int[] n=new int[N];
int k=0;
Arrays.sort(arr1);
Arrays.sort(arr2);
int i=0,j=0;
while(i<arr1.length&&j<arr2.length){
if(arr1[i]<arr2[j]){
i++;
}else if(arr1[i]>arr2[j]){
j++;
}else{
n[k++]=arr1[i];
i++;
j++;
}
}
n=Arrays.copyOf(n, k);
return n;
}
算法三:
map计数,时间复杂度O(n),空间复杂度O(n),空间换时间
public class Intersect {
public static ArrayList<Integer> getIntersection3(int[] arr1, int[] arr2) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(arr1 == null || arr1.length == 0 || arr2 == null || arr2.length == 0) {
return res;
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0;i < arr1.length;i ++) {
int key = arr1[i];
if(!map.containsKey(key)) {
map.put(key, 1);
}
else {
int value = map.get(key);
value ++;
map.put(key, value);
}
}
for(int i = 0;i < arr2.length;i ++) {
int key = arr2[i];
if(map.containsKey(key) && !res.contains(key)) {
res.add(key);
}
}
return res;
}
public static void main(String[] args) {
int[] arr = {1,2,5,3,3,4};
int[] arr2 = {2,3,3,4,5,6};
List<Integer> res = getIntersection3(arr, arr2);
System.out.println(res);
}
}