C 从数组中找出非负数的最大子数组
答:[1,2,5,-7,2,3]这两个子数组是[1,2,5][2,3]。 答案是[1,2,5],因为其总和大于[2,3] 注:如果有平局,则与段的长度和具有最大长度的返回段进行比较。 注2:如果仍然存在平局,则返回具有最小起始索引的段 我已经为某些情况编写了代码及其工作原理,但不适用于此:C 从数组中找出非负数的最大子数组,c,arrays,C,Arrays,答:[1,2,5,-7,2,3]这两个子数组是[1,2,5][2,3]。 答案是[1,2,5],因为其总和大于[2,3] 注:如果有平局,则与段的长度和具有最大长度的返回段进行比较。 注2:如果仍然存在平局,则返回具有最小起始索引的段 我已经为某些情况编写了代码及其工作原理,但不适用于此: A : [ 1967513926, 1540383426, -1303455736, -521595368 ] Your function returned the following : 196751392
A : [ 1967513926, 1540383426, -1303455736, -521595368 ]
Your function returned the following :
1967513926
The expected returned value :
1967513926 1540383426
这是我的密码
int* maxset(int* A, int n1, int *length_of_array) {
int greatin=0,greatout=0,greatin1=0,number1=0,number=0;
int n3,i,count=0,k,sum=0,max=0,ini=0,end=0;
for(i=0;i<n1;i++)
{
ini=end;
if(A[i]>=0)
{
count=1;
number++;
sum=sum+A[i];
if (sum>max )
{
max=sum;
greatout=i;
greatin=ini;
}
else if (sum==max && number>number1)
{
max=sum;
greatout=i;
greatin=ini;
}
}
else
{
sum=0;
end=i+1;
number1=number;
number=0;
}
}
if(count>0)
{
count=0;
n3=greatout-greatin+1;
*length_of_array=n3;
int * ret = (int *) malloc(sizeof(int) * *length_of_array);
for(i=greatin;count<n3;i++)
{
ret[count]=A[i];
count++;
}
return ret;
}
else
{
*length_of_array=0;
int * ret = (int *) malloc(sizeof(int) * *length_of_array);
return ret;
}
}
您使用的是int,当您添加时,超出了此处已回答的2147483647限制:这是一个不同的问题,因为,数组可以包含一个负数,该负数要求子数组的整个和为非负数。但在这种情况下,子数组不能有负数。因此,每当遇到负值时,移除该值并拆分数组?是的,每当数组中遇到负数时,直到该部分成为子阵列,并且在该负值之后开始下一个子阵列。我们现在必须找到子数组的最大值。我们实际上并没有删除负值。。