《摘自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 &lt; n -1 ) index_y++;
        else
        {
            index_x++;
            continue;
        }
        while(index_y &lt; n)
        {
            abs_xy = abs(x[index_x] - y[index_y]);
            if(abs_xy &lt; 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] &gt; y[j],那么排在y[j]前面的元素与x[i]的距离一定大于d。因为如果y[k]排在前面,则y[k] < y[j],因此等到d = x[i] – y[j] &lt; 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 &lt; m &&  index_y &lt; 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;

}