题目描述
在数组中,某个数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如,在数组{2,4,1,16,7,5,11,9}中,数对之差的最大值是11,是16减去5的结果。
分析
定义D[i]是以数组中第i个数字为减数的所有数对之差的最大值。根据题意,用N[i]表示数组的第i个元素,就是说对于任意h<i,D[i]>=N[h]-N[i]。所以D[i]的最大值就是整个数组的最大的数对之差。来手写求一下最大数对之差的过程。
M[0] = 2;
D[1] = M[0] - N[1] = 2 - 4 = -2;
maxDiff = 2;
M[1] = max{M[0],N[1]} = max{2,4} = 4;
D[2] = M[1] - N[2] = 4 - 1 = 3;
maxDiff = max{maxDiff,D[2]} = 3;
M[2] = max{M[1],N[2]} = max{4,1} = 4;
D[3] = M[2] - N[3] = -12;
maxDiff = max{maxDiff,D[3]} = 3;
M[3] =16;
D[4] = 9;
maxDiff = 9;
M[4] = 16;
D[5] = 11;
maxDiff = 11;
M[5] = 16;
D[6] = 5;
maxDiff = 11;
M[6] = 16;
D[7] = 7;
maxDiff = 11;
这里的 M[i-1] 表示的是当前第i个元素之前的i-1个元素中的最大值。而maxDiff则是i之前包括位置i在内的最大数对之差的值。
C代码实现
int MaxDiff(int numbers[], int length) {
if(numbers == NULL || length < 2)
return 0;
int max = numbers[0];
int maxDiff = max - numbers[1];
for(int i=2;i<length;++i) {
if(numbers[i] < max) {
max = numbers[i];
}
int curDiff = max - numbers[i];
if(curDiff > maxDiff) {
maxDiff = curDiff;
}
}
return maxDiff;
}
THE END.