问题描述:
给定两个整数数组(第一个是数组 A
,第二个是数组 B
),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|)。返回最小差。
样例:给定数组 A = [3,4,6,7]
, B = [2,3,8,9]
,返回 0
。
算法设计:
方法一:先将A与B从小到大排序,从A的第一个数开始到最后一个数求差值。在每一轮循环中,要先求出A[i]到B[0]的差值,这应该是本轮遍历的最大差值,遇到比这还大的差值,跳出本轮循环:
public static int smallestDifference2(int[] A, int[] B) {
if(A==null||B==null||A.length==0||B.length==0){
return 0;
}
//先将A,B从小到大排序
A=Quick(A,0,A.length-1);
B=Quick(B,0,B.length-1);
//A,B元素的差
int dif=0;
//保留最小差值
int min=abs(A[0],B[0]);
for(int i=0;i=dif){
min=dif;
}
}
if(min>=k){
min=k;
}
}
return min;
}
//返回两数的绝对差
public static int abs(int a,int b){
int num=a-b;
if(num<0){
num=num*(-1);
}
return num;
}
public static int[] Quick(int[] numbers,int left,int right){
if(right==left){
return numbers;
}
if(numbers==null||numbers.length==0){
return null;
}
int pos=left;
int j=right;
int temp=0;
while(jpos&&numbers[pos]>=numbers[j])||(jpos){
j--;
}else{
j++;
}
}
if(leftpos+1){
Quick(numbers,pos+1,right);
}
return numbers;
}
for(int i=0;i
方法三:相比于方法一,我们还可以使用二分法缩小循环次数
(1)、首先还是要将A,B进行排序
(2)、从A的第一个数开始到A的最后一个数,循环求最小差值;
(3)、在每一轮循环中,使用二分法找到最小值:begin=A[i]-B[0];end=A[i]-B[B.length-1];mid=A[i]-B[(B.length-1)/2];
(4)、如果min>mid,那么跳到0到(B.length-1)/2中寻找最小差值,否则,在(B.length-1)/2到(B.length-1)中寻找最小差值;