转载自:http://blog.csdn.net/onezeros
两数组最短距离
Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByte
Total Submit: 86 Accepted: 41
Total Submit: 86 Accepted: 41
Description
已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离。
Input
第一行为两个整数m, n(1≤m, n≤1000),分别代表数组f[], g[]的长度。
第二行有m个元素,为数组f[]。
第三行有n个元素,为数组g[]。
Output
数组的最短距离
Sample Input
5 5
1 2 3 4 5
6 7 8 9 10
Sample Output
1
Hint
你能想出O(n+m)的算法吗?^_^
我的答案:
int miniDistance(int* a,int* b,int aLen,int bLen)
{
int aPos,int bPos;
int miniDistance;
int aPointer=0;
int bPointer=0;
int dist=pow(2,sizeof(int)-1)-1;//big enough
//at any time ,increase pointer of the small number side,
//because increase pointer of big number side only can increase the distance
//which is not helpful to our goal
while(aPointer<aLen&&bPointer<bLen){
int tmp=0;
if(*(a+aPointer)<*(b+bPointer)){
tmp=*(b+bPointer)-*(a+aPointer);
if(tmp<dist){
dist=tmp;
aPos=aPointer;
bPos=bPointer;
}
aPointer++;
}else if(*(a+aPointer)>*(b+bPointer)){
tmp=*(a+aPointer)-*(b+bPointer);
if(tmp<dist){
dist=tmp;
aPos=aPointer;
bPos=bPointer;
}
bPointer++;
}else{//equal
aPos=aPointer;
bPos=bPointer;
miniDistance=0;
return;
}
}
//shortest distance found for the moment
miniDistance=dist;
//situation(aPointer==aLen&&bPointer==bLen)&&
//situation(aPointer<aLen&&bPointer<bLen) do not exist
if(aPointer==aLen){
while(*(a+aPointer-1)>*(b+bPointer)&&bPointer<bLen){
bPointer++;
}
if(bPointer==bLen){
bPos=bPointer;
miniDistance=*(a+aPointer-1)-*(b+bPointer);
}else{
int latter=*(b+bPointer)-*(a+aPointer-1);
int former=*(a+aPointer-1)-*(b+bPointer-1);
if(latter<former&&latter<dist){
bPos=bPointer;
miniDistance=latter;
}else if(former<dist){
bPos=bPointer-1;
miniDistance=former;
}
}
}else{//bPointer==bLen
while(*(a+aPointer)<*(b+bPointer-1)&&aPointer<aLen){
aPointer++;
}
if(aPointer==aLen){
aPos=aPointer;
miniDistance=*(b+bPointer)-*(a+aPointer-1);
}else{
int latter=*(a+aPointer)-*(b+bPointer-1);
int former=*(b+bPointer-1)-*(a+aPointer-1);
if(latter<former&&latter<dist){
aPos=aPointer;
miniDistance=latter;
}else if(former<dist){
aPos=aPointer-1;
miniDistance=former;
}
}
}
return miniDistance;
}