可以使用递归找到最大的和的连续子数组,这样函数就会直接返回输出。
下面是我的解决方案,其中我存储以每个索引结尾的max子数组,然后在print()函数中找到最大的子数组。但是,我想要以下
我的代码使用递归函数和帮助器print()函数来查找这些数字中最大的
#include <stdio.h>
//int a[] = {-6,60,-10,20};
int a[] = {-2, -3, 4, -1, -2, 1, 5, -3};
int len = sizeof(a)/sizeof(*a);
int maxherearray[10];
int main(void)
{
fun(len-1);
printf("max sub array == %d\n",print(maxherearray));
printf("\n");
return 0;
}
int fun(int n)
{
if(n==0)
return a[n];
maxherearray[n] = max(a[n], a[n]+fun(n-1));
return maxherearray[n];
}
int max(int a, int b)
{
return (a > b)? a : b;
}
编辑:发布我错过的print()函数
//Please make sure that #include <limits.h> is added
int print(int a[])
{
int i = 0;
int largest = INT_MIN;
printf("largest == %d\n",largest);
for(i=0;i<len;i++)
{
if(a[i] > largest)
largest = a[i];
}
return largest;
}
答案 0 :(得分:2)
通常,您的算法逻辑正常。就像,
f(0) = a(i);
f(i) = max(f(i-1) + a(i), a(i));
,获取中间结果数组max(0, f(1), f(2), ... , f(n-1))
,获取最终的max_sub结果你为#2设计了一个名为fun
的函数,为#3设计了一个a helper print()
。
现在,(我猜)你想要的是将#2和#3结合在一起,即利用#2的中间结果来避免额外的计算/内存空间。就原始算法逻辑而言,这里有一些可能的方法,例如
在fun
中添加参数以保持max_sub结果
int fun(int n, int *result)// add int *result to return max_sub
{
int max_here = 0;
if(n==0){
return a[n];
}
max_here = max(a[n],a[n]+fun(n-1, result));
*result = max(*result, max_here);
return max_here;
}
//...
int main(void)
{
int result = 0;
fun(len-1, &result);
printf("max sub : %d\n", result);
}
使用全局变量(哦!)及时获取max_sub
int g_maxhere = 0;
int fun2(int n)
{
if(n==0){
return a[n];
}
g_maxhere = max(g_maxhere, max(a[n],a[n]+fun2(n-1)));
return max(a[n], a[n]+fun2(n-1));
}
//...
int main(void)
{
fun2(len-1);
printf("max sub:%d\n",g_maxhere)
}
事实上,使用辅助函数的原始解决方案可以使您的算法更清晰。
答案 1 :(得分:1)
引入两个全局变量int main(void){
int i =0;
char a2[] = "aaaa";
char a1[] = "bbb";
printf("%lu\n",sizeof(a2));
printf("%lu\n",sizeof(a1));
printf("%c\n",a2[4]);
printf("---\n");
for(i =0; i < sizeof(a2); i++){
a2[i]=a1[i];
printf("%c\n", a2[i]);
}
printf("---\n");
printf("%c\n", a2[4]);
return 0;
}
和start_idx
来跟踪最大的连续子数组的开始和结束索引。在递归函数中相应地更新这些变量。
end_idx