找到数组最大子集的总和

时间:2017-03-29 06:16:57

标签: arrays dynamic-programming

我正在解决一个CS问题,即我们给出了大小为N的数组,使得N <= 100000,并且该数组将具有负整数和正整数,现在我们必须找到最大的总和数组的子集,或者更正式地我们必须找到索引i和j,这样这些元素之间的元素总和将是最大可能的。

这是一个例子: N = 5,数组= {12,-4,-10,4,9},答案= 13,因为4 + 9是我们能得到的最好的。

我知道这可以通过二次时的强力解决,但我想知道这是否可以在对数时间线性地解决。

提前致谢。

1 个答案:

答案 0 :(得分:3)

根据this演示文稿,Kadane的算法显然产生了线性运行时限;从中获取的C ++实现如下所示。

int maxSubArraySum(int a[], int size)
{
    int max_so_far = INT_MIN, max_ending_here = 0;

    for (int i = 0; i < size; i++)
    {
        max_ending_here = max_ending_here + a[i];
        if (max_so_far < max_ending_here)
            max_so_far = max_ending_here;

        if (max_ending_here < 0)
            max_ending_here = 0;
    }
    return max_so_far;
}