我正在解决一个CS问题,即我们给出了大小为N的数组,使得N <= 100000,并且该数组将具有负整数和正整数,现在我们必须找到最大的总和数组的子集,或者更正式地我们必须找到索引i和j,这样这些元素之间的元素总和将是最大可能的。
这是一个例子: N = 5,数组= {12,-4,-10,4,9},答案= 13,因为4 + 9是我们能得到的最好的。
我知道这可以通过二次时的强力解决,但我想知道这是否可以在对数时间线性地解决。
提前致谢。
答案 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;
}