返回数组中的一对数字p和q。 p必须阵列q中之前出现,和QP必须是可能的最高值递归获得数组中的最大差异
A = [1,4,12,5,9,1,3,8]
返回值将会是p = 1 & q = 12
有人建议下面的解决方案。 但是我不知道它应该在“第三案”返回的建议如下:
建议:
分A在A1均匀地分成两个较小的排列A1,A2,并解决问题(递归)和A2。这可以帮助你找到最佳的A吗?不要忘记你可以使用额外的处理,花费高达O(n)。假设p,q是A的最优对。p,q∈A1或p,q∈A2,或者都不是案件属实。在第三种情况下,你可以说p和q?
下面是我的代码,它基本上将数组分开,并从前半部分获得最小值,从后半部分获得最大值。有0(n)的解决方案,但我对递归有兴趣,因为我正在学习递归。所以请不要建议任何其他解决方案。
#define min_f(a, b) (a)>(b)?(b):(a)
#define max_f(a, b) (a)>(b)?(a):(b)
#define MAX 1 << 30
#define MIN -1
int get_min(int *a, int start, int end)
{
int t_min = MAX;
while(start <= end) {
t_min = min_f(t_min, a[start]);
start++;
}
return t_min;
}
int get_max(int *a, int start, int end)
{
int t_max = MIN;
while(start <= end) {
t_max = max_f(t_max, a[start]);
start++;
}
return t_max;
}
int foo(int *a, int start, int end)
{
int g_max = MIN;
int min, max, i;
for(i=0;i<=end;i++) {
min = get_min(a, start, i);
max = get_max(a, i+1, end);
if (max > min) {
g_max = max_f(g_max, max-min);
}
}
return g_max;
}
int main()
{
int a[] = {1,4,12,5,9,1,3,8};
int size = sizeof(a)/sizeof(a[0]);
printf("%d\n", foo(a, 0, size-1));
return 0;
}
闻起来像功课。 – mikeb
@mikeb:你为什么这么想?我真的不喜欢那些不问问题的人,并假设(你和我)。 http://cs.stackexchange.com/questions/14665/create-divide-and-conquer-algorithm/14668#14668 –
不,我不会删除它,因为即使它不是“家庭作业”,你应该尝试当你陷入困境时,自己想办法来到这里。你来这里试图让某人为你做,而不是至少做出努力。采取刺解决方案,我不仅会删除-1,我会帮你解决它。如果这个问题太难了,也许你应该解决一些简单的问题,比如一个函数采用n来返回斐波那契(n)。这是一个经典的递归问题,应该让你开始。 – mikeb