对于HackerRank挑战The Maximum Subarray,我们也应该为负数实现K_Dane算法。
下面是我的C实现,我试图弄清楚如何调试它,但是没有成功这样做,有人能帮我弄清楚代码中的错误吗?
#include <stdio.h>
int main(void)
{
long long int t, n;
scanf("%lld", &t);
while(t--)
{
scanf("%lld", &n);
long long int numbers[n], i;
for(i = 0;i < n;i++)
{
scanf("%lld", &numbers[i]);
}
long long int contigoussum = numbers[0],crtsum = numbers[0], sum = numbers[0];
for(i = 1;i < n;i++)
{
if(numbers[i] + sum > sum)
{
sum += numbers[i];
}
crtsum += numbers[i];
if(crtsum > contigoussum)
{
contigoussum = crtsum;
}
else
crtsum = 0;
}
printf("%lld %lld\n", contigoussum, sum);
}
return 0;
}
尽管如此,我并不知道所有测试用例代码都无法正常工作,但我想出了一个:
输入
1
6
2 -1 2 3 4 -5
输出
7 11
真实答案:我认为它是10 11
,因为最大的连续总和可能是[2 -1 2 3 4]
。
答案 0 :(得分:2)
答案 1 :(得分:1)
对于所有负数组
,接受的答案都失败了void calc(vector<int>& ar){
int contigoussum = 0,crtsum = 0, sum = 0;
int positive=0;
int max=ar[0];
for(int i = 0;i < ar.size();i++)
{
if(ar[i]>0)
positive =1;
else if (ar[i]>max)
max=ar[i];
if(ar[i] + sum > sum)
{
sum += ar[i];
}
crtsum += ar[i];
if(crtsum > contigoussum)
{
contigoussum = crtsum;
}
else if(crtsum <0)
crtsum = 0;
}
if(positive)
cout<< contigoussum<<" "<<sum<<endl;
else
cout<< max<<" "<<max<<endl;
}