题目:已知两个元素从小到大排列的数组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即可!
代码与真相:
#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函数。
代码盲抢个沙发路过!
你抢吧!你抢得越凶我就越兴奋!你喊破喉咙也不会有人理你的!
嘿嘿嘿,前排上座,貌似都是经典题目嘛 ~
以后小邪说不定要用到,就当这里图书馆鸟 ~
呵呵。我把这个事情坚持下去了,就有价值了。
囧rz…
看不懂的说。
当年学过C的皮毛,早己忘光了
看懂了代码,很好的题!
呵呵。以后多来我这里逛啊!