题目:
在数组中,每个数字减去它右边的所有数字得到一个数对之差。求所有数对之差的最大值。
例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是9,是16减去5的结果。
分析:
要使 a-b要最大,只有a最大且a右边的数要最小,这样得到的结果才是正确的。
所以第一步,找到除最后一个元素外最大的那个元素,再找到最大元素之后的元素中最小的一个数,它们的差才是我们要的结果。
/*
在数组中,每个数字减去它右边的所有数字得到一个数对之差。求所有数对之差的最大值。
例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是9,是16减去5的结果。
*/
#include <stdio.h>
#include <assert.h>
int getMax(int a[], int len)
{
int i, maxi = 0, min;
assert(len > 1); // num of a-array must be large than 1
for(i = 1; i < len-1; i++) // maxi指向a[0 ~ len-2]中最大元素的下标
{
if(a[maxi] < a[i])
maxi = i;
}
min = a[maxi+1];
for(i = maxi+1+1; i < len; i++) // min=a[maxi+1 ~ len-1]中的最小元素
{
if(min > a[i])
min = a[i];
}
return (a[maxi] - min);
}
int main()
{
int a[] = {2, 4, 1, 16, 7, 5, 11, 9};
int max = getMax(a, sizeof(a) / sizeof(a[0]));
printf("max=%d\n", max);
return 0;
}
这个程序在运行时,一定要保证数组元素必须在2个及以上,否则就失去了题目的本意!