今天在网上看了一个面试题,很有意思!博主讲解的很到位,思路清晰流畅,代码简洁美观。从分治法 到 一种变形 再到 动态规划。看完之后,自己把思路整理了一下,把代码自己巧了一遍。
题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{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;
}