我有这个实现,这个程序的结果是100,但正确的答案是103。 有谁知道这个实现有什么问题,或者是否有更好的方法来查找数组中最大连续的整数和?
提前致谢。
#include <stdio.h>
int main(void) {
int a[] = { -3, 100, -4, -2, 9, -63, -200, 55 };
int max_sum, temp_sum, i, n = 12, t;
temp_sum = max_sum = a[0];
for (i = 1; i < n; i++) {
if (a[i] > 0)
temp_sum += a[i];
else {
t = 0;
while (a[i] < 0 && i < n) {
t += a[i];
i++;
}
if (temp_sum + t > 0) {
temp_sum = temp_sum + t + a[i];
if (temp_sum > max_sum)
max_sum = temp_sum;
} else if (i < n)
temp_sum = a[i];
}
}
if (temp_sum > max_sum)
max_sum = temp_sum;
printf("Maximum Numbers is %d \n", max_sum);
return 0;
}
答案 0 :(得分:6)
您没有使用正确的索引:
点击此处查看演示:http://codepad.org/wbXZY5zP
int max_sum, temp_sum, i, n = 8, t;
temp_sum = max_sum = a[0];
for (i = 0; i < n; i++) {
(...)
}
答案 1 :(得分:4)
我建议Kadane's algorithm。在C ++中它将是这样的(未经测试):
int maxSubarray(std::vector<int> a) {
int maxAll = 0, maxHere = 0;
for (size_t i = 0; i < a.size(); ++i) {
maxHere = std::max(a[i], maxHere + a[i]);
maxAll = std::max(maxAll, maxHere);
}
return maxAll;
}
答案 2 :(得分:1)
其他用户指出,您的实施指数不正确。然而,我认为有必要添加一个答案,指出如果所有值都为负数(并且最接近正数不在第一个位置),则执行失败。
此问题的快速解决方法是在a[i] < 0 && temp_sum + t < 0
- 最后一个块的情况下分配临时总和时添加一个检查。
} else if (i < n) {
temp_sum = a[i];
if (temp_sum > max_sum)
max_sum = temp_sum;
}
答案 3 :(得分:0)
如果它正在寻找不是从索引0开始的最大连续总和,最简单的方法是有两个循环
int max_sum, temp_sum, i, n = 8, t;
max_sum = a[0];
for (t = 0; t < n; t++) {
temp_sum = 0;
for (i = t; i<n; i++) {
temp_sum += a[i];
if (temp_sum > max_sum)
max_sum = temp_sum;
}
}