题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。
思路分析:
数组需要求出左边的最大值,和右边的最小值,那么数对之差就为左边最大值减去右边最小值
可以将数组划分,那么数对之差最大值 可能有三种情况
1 左边数组数对之差
2 右边数组数对之差
3 左边最大值 减去右边最小值
分治法解决
#include "stdio.h"
#include "stdlib.h"
int arrayGap(int *data,int start,int end,int *max,int *min)
{
int middle;
int innerMax,innerMin;
int innerRMax,innerRMin;
int maxLeftDiff,maxRightDiff;
int crossDiff;
int gap;
if(start == end)
{
*max = data[start];
*min = data[start];
return 0x80000000;
}
middle = start +(end-start)/2;
maxLeftDiff = arrayGap(data,start,middle,&innerMax,&innerMin);
maxRightDiff = arrayGap(data,middle+1,end,&innerRMax,&innerRMin);
crossDiff = innerMax - innerRMin;
*max = (innerMax > innerRMax) ? innerMax: innerRMax;
*min = (innerMin < innerRMin) ? innerMin : innerRMin;
printf("max %d min %d start :%d end: %d\n",*max,*min,start,end);
gap = (maxLeftDiff > maxRightDiff) ? maxLeftDiff:maxRightDiff;
gap = (gap > crossDiff) ? gap :crossDiff;
printf("%d start :%d end: %d\n",gap,start,end);
return gap;
}
int main()
{
int num;
int data[] = {2, 4, 1, 16, 7, 5, 11, 9};
int i;
int max,min;
int maxGap = 0;
num = 7;
maxGap = arrayGap(data,0,num,&max,&min);
printf("%d \n",maxGap);
return 0;
}