3

我有这个实现,这个程序的结果是 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;
}
4

4 回答 4

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++) {
    (...)
}
于 2012-04-10T19:54:58.187 回答
4

我建议Kadane 的算法。在 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;
}
于 2012-04-10T19:54:39.527 回答
1

正如其他用户所指出的,您的实施索引不正确。但是,我认为有必要添加一个答案,以指出如果所有值都是负数(并且最接近正数不在第一位),则您的实现将失败。

一个快速解决这个问题的方法是在分配临时总和时添加一个检查a[i] < 0 && temp_sum + t < 0- 在最后一个 else 块的情况下。

} else if (i < n) {
    temp_sum = a[i];
    if (temp_sum > max_sum)
       max_sum = temp_sum;
}
于 2012-04-10T20:12:35.040 回答
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;
    }
}
于 2012-04-10T20:06:11.627 回答