《摘自C语言名题精选百则》
题目:已知两个元素从小到大排列的数组x[]与y[],请写一个程序算出两个数组元素彼此之间差的绝对值中最小的一个,这叫做数组的距离。写一个程序,算出这个距离。
我看到题目的想法:固定x[i]中的下标i,然后一次遍历数组g[],算出x[i]-g[j]的绝对值,记作abs(x[i]-g[j]),当满足abs(x[i]-g[j]) > abs(x[i]-g[j-1]),即可退出循环,将i+=1,重新开始上述过程
我的程序如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
int x[4] = {1,4,5,9};
int y[8] = {2,3,5,8,10,12,13,14};
int min = mindist(x, 4, y, 8);
printf("%d\n", min);
return 0;
}
int mindist(int *x, int m, int *y, int n)
{
int index_x = 0;
int index_y = 0;
int min_temp = 0;
int min = abs(x[0] - y[0]);
int abs_xy = 0;
int count = 0;
while(index_x < m)
{
min_temp = abs(x[index_x] - y[index_y]);
count++;
if(index_y < n -1 ) index_y++;
else
{
index_x++;
continue;
}
while(index_y < n)
{
abs_xy = abs(x[index_x] - y[index_y]);
if(abs_xy < min_temp)
{
min_temp = abs_xy;
index_y++;
}
else
{
break;
}
}
index_x++;
if(min > min_temp)
min = min_temp;
}
printf("%d\n", count);
return min;
}
后面看了书中给出的参考答案,它的想法是这样的:
如果x[i]与y[j]的距离为d,而且x[i] > y[j],那么排在y[j]前面的元素与x[i]的距离一定大于d。因为如果y[k]排在前面,则y[k] < y[j],因此等到d = x[i] – y[j] < x[i] – y [k].
所以如果x[i] > y[j],就可以确定i而不断增加j,反之,则可以确定j而不断增加i。
书中给出的程序如下:
#include <limits.h>
#define min(x,y) ((x) < (y) ? (x) : (y))
int min_distance(int x[], int y[], int m, int n)
{
int mindist = INT_MAX;
int index_x = 0;
int index_y = 0;
while(index_x < m && index_y < n)
{
if(x[index_x] >= y[index_y])
{
mindist = min(mindist, x[index_x] – y[index_y]);
index_y++;
}
else
{
mindist = min(mindist, y[index_y] – x[index_x]);
index_x++;
}
}
return mindist;
}
转载于:https://blog.51cto.com/charlesxie/781315