版权声明:无意呢。 https://blog.csdn.net/qq_41900081/article/details/86531432
题目:
给定两个有序整型数组array_1和array_2,数组的元素是递增的,且数组中没有重复的元素,计算array_1和array_2的交集。
常规解法:二路归并
//求两个有序数组的交集
static int getIntersection(int array_1[],int len1,int array_2[],int len2,List<Integer> c) {
int i = 0, j = 0, k = 0;
while(i < len1 || j <len2) {
if(array_1[i] == array_2[j]) {
c.add(array_1[i]);
i++;
j++;
k++;
}else if(array_1[i] > array_2[j]) {
j++;
}else if(array_1[i] < array_2[j]) {
i++;
}
}
return k;
}
如果 遇到两个长度差距悬殊的数组,则可以选择更优的算法:
我们可以遍历短的数组,然后使用二分查找(有序)在长数组中查找,如果找到了就放进交集元素数组中,否则继续遍历,直到遍历完短数组为止。
//求两个长度悬殊的有序数组的交集
static int getIntersection(int array_1[],int array_2[],List<Integer> c) {
int long_[] = null;
int short_[] = null;
if(array_1.length <= array_2.length) {
short_ = array_1;
long_ = array_2;
}else {
short_ = array_2;
long_ = array_1;
}
for(int i = 0;i < short_.length; i++) {
int result = Arrays.binarySearch(long_,short_[i]);
if(result > 0) {
c.add(short_[result]);
}
}
return 0;
}
完整测试代码
package dataStructure;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyArray {
//打印数组
static void Print(List<Integer> c) {
for(int a : c) {
System.out.print(a + " ");
}
}
//求两个有序数组的交集
static int getIntersection(int array_1[],int len1,int array_2[],int len2,List<Integer> c) {
int i = 0, j = 0, k = 0;
while(i < len1 || j <len2) {
if(array_1[i] == array_2[j]) {
c.add(array_1[i]);
i++;
j++;
k++;
}else if(array_1[i] > array_2[j]) {
j++;
}else if(array_1[i] < array_2[j]) {
i++;
}
}
return k;
}
//求两个长度悬殊的有序数组的交集
static int getIntersection(int array_1[],int array_2[],List<Integer> c) {
int long_[] = null;
int short_[] = null;
if(array_1.length <= array_2.length) {
short_ = array_1;
long_ = array_2;
}else {
short_ = array_2;
long_ = array_1;
}
for(int i = 0;i < short_.length; i++) {
int result = Arrays.binarySearch(long_,short_[i]);
if(result > 0) {
c.add(short_[result]);
}
}
return 0;
}
public static void main(String[] args) {
int a[] = {2,5,6,8,9};
int b[] = {1,5,6,7,9};
List<Integer> c =new ArrayList<>();
//getIntersection(a, a.length, b, b.length, c);
getIntersection(a, b, c);
Print(c);
}
}