面试训练数对之差最大值

题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值