求数对之差最大值

        今天在网上看了一个面试题,很有意思!博主讲解的很到位,思路清晰流畅,代码简洁美观。从分治法 到 一种变形 再到 动态规划。看完之后,自己把思路整理了一下,把代码自己巧了一遍。

        题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。

       详细分析 请看http://zhedahht.blog.163.com/blog/static/2541117420116135376632/

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define MaxDiff_Solution3 MaxDiff_Solution

int MaxDiff_Solution1(int number[], int length){
	int MaxDiffCore(int* start, int* end, int* max, int* min);
	if(number == NULL || length < 2)
		return 0;
	int max, min;
	return MaxDiffCore(number, number + length -1, &max, &min);
}

int MaxDiff_Solution2(int number[], int length){
	if(number == NULL || length < 2)
		return 0;
	int *diff = new int[length - 1];
	for(int i = 1; i < length; i++)
		diff[i - 1] = number[i - 1] - number[i];
	int currentSum = 0;
	int greatestSum = 0x80000000;
	for(int i = 0; i < length - 1; i++){
		if(currentSum <= 0)
			currentSum = diff[i];
		else
			currentSum += diff[i];
		if(currentSum > greatestSum)
			greatestSum = currentSum;
	}
	delete[] diff;
	return greatestSum;
}

int MaxDiff_Solution3(int number[], int length){
	if(number == NULL || length < 2)
		return 0;
	int max = number[0];
	int maxDiff = max - number[1];
	for(int i = 2; i < length; i++){
		if(number[i - 1] > max)
			max = number[i - 1];
		int currentDiff = max - number[i];
		if(currentDiff > maxDiff)
			maxDiff = currentDiff;
	}
	return maxDiff;
}

int MaxDiffCore(int* start, int* end, int* max, int* min){
	if(end == start){
		*max = *min = *start;
		return 0x80000000;
	}
	int *mid = start + (end - start)/2;
	int leftMax, leftMin;
	int leftDiff = MaxDiffCore(start, mid, &leftMax, &leftMin);
	int rightMax, rightMin;
	int rightDiff = MaxDiffCore(mid+1, end, &rightMax, &rightMin);
	int crossDiff = leftMax - rightMin;
	*max = (leftMax > rightMax) ? leftMax : rightMax;
	*min = (leftMin < rightMin) ? leftMin : rightMin;
	int maxDiff = (leftDiff > rightDiff) ? leftDiff : rightDiff;
	maxDiff = (maxDiff > crossDiff) ? maxDiff : crossDiff;
	return maxDiff;
}

void Test(int number[], int length, int expected){
	for(int i = 0; i < length; i++)
		printf("%4d", number[i]);
	printf("\n--------------------------------\n");
	int MaxDiff = MaxDiff_Solution(number, length);
	if(MaxDiff == expected)
		printf("MaxDiff: %4d  Expected: %4d  PASS!\n\n", MaxDiff, expected);
	else
		printf("MaxDiff: %4d  Expected: %4d  FAIL!\n\n", MaxDiff, expected);
}

void Test1(){
	int number[] = {2, 4, 1, 16, 7, 5, 11, 9};
	Test(number, 8, 11);
}

void Test2(){
	int number[] = {2, 4, 6, 16, 18, 25, 31, 39};
	Test(number, 8, -2);
}

void Test3(){
	int number[] = {1, 1, 1, 1, 1, 1, 1, 1};
	Test(number, 8, 0);
}

void Test4(){
	int number[] = {-2, 3, -15, 9, 2, -6, 2, 9};
	Test(number, 8, 18);
}

int main(){
	Test1();
	Test2();
    Test3();
	Test4();
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值