C语言名题系列:最短距离

  题目:已知两个元素从小到大排列的数组x[]与y[],请编写一个程序算出两个数组元素间彼此之间的绝对值中最小的一个数,此值叫做数组的最短距离!

  如果x[i]与y[j]是两个元素,那么|x[i]-y[j]|就是这两个元素之间的距离,所有的距离的最小值即为所求。如果x中有m个元素,y中有n个元素,则有m*n个距离!

  思路:利用两个数组排序好的特性,可用不必计算m*n个距离!如果d为x[i]与y[j]的距离!如果x[i]>y[j],则y数组中y[j]前面的元素与x[i]的距离都大于d,因为数组是从小到大排列的。就像1, 4, 8, 9和0, 2, 3, 4, 10两个数组中,|8-3| < |8-2| < |8-0|一样!相应的:如果y[j]>x[i],则x中x[i]前面的元素与y[j]的距离都要大于d!因此,发现x[i]>y[j]时,固定i,增加j,可以使d越来越小!直到y[j]>x[i]时,同样的道理固定j,增加i可使d越来越小!用一个变量记录下最小的d即可!
  代码与真相:

#include <limits .h>
#define  min(x, y)     ((x) < (y) ? (x) : (y))

int  min_distance(int x[], int y[], int m, int n)
{
     int  minimum = INT_MAX;
     int  i = 0, j = 0;

     while (i < m && j < n)
          if (x[i] >= y[j]) {
               minimum = min(minimum, x[i]-y[j]);
               j++;
          }
          else {
               minimum = min(minimum, y[j]-x[i]);
               i++;
          }
     return minimum;
}

  说明:保存最小值的变量需要有一个初始值。其值要大于所有可能的距离值才行!所以引入了极限值INT_MAX,并且通过x[i]与y[j]的大小关系控制,避免了调用abs函数。


Related posts

此条目发表在 C/C++ 分类目录,贴了 , , , 标签。将固定链接加入收藏夹。

C语言名题系列:最短距离》有 8 条评论

  1. Revolution 说:

    代码盲抢个沙发路过!

  2. evlos 说:

    嘿嘿嘿,前排上座,貌似都是经典题目嘛 ~
    以后小邪说不定要用到,就当这里图书馆鸟 ~

  3. iBoluo 说:

    囧rz…
    看不懂的说。

  4. Dickey 说:

    当年学过C的皮毛,早己忘光了

  5. cloudxiao 说:

    看懂了代码,很好的题!

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>