繁体   English   中英

最大连续子数组和的线性时间算法

[英]Linear time algorithm for Maximum contiguous sub-array sum

我一直在解决算法导论-CLRS中的练习 ,遇到了在线性时间内求解最大连续子数组的问题(问题4.1-5)。 请在下面查看我的解决方案。 我一直在寻找此练习的在线法官,但没有找到。 在寻找解决方案时解决了该问题后,我发现kadane的算法似乎与我的实现不同,当所有数字均为负数时,此解决方案也会提供正确的输出。

public static int linearMaxSolve(int[] arr) {
int max = Integer.MIN_VALUE;
int sum = 0;
for (int i : arr) {
    sum += i;
    if (i > sum) {
        sum = i;
    }
    if (sum > max) {
        max = sum;
    }
}
return max;
}

除了将人工测试用例提供给程序外,是否有办法检查此算法的有效性?

这实际上取决于您对具有所有负值的数组的定义。

如果您不将空子数组视为可能的解决方案,那么可以,您的解决方案是正确的,并且实际上与Kadane的算法完全相同。

int max_so_far = a[0];
int max_ending_here = a[0];

for (int i = 1; i < size; i++)
{
    max_ending_here = Math.max(a[i], max_ending_here+a[i]);
    max_so_far = Math.max(max_so_far, max_ending_here);
}
return max_so_far;

唯一的区别是初始化,但是如果您仔细看一下,在算法的第一次迭代中, summax的值都将为a[0]

但是再次,您在这里假设您的数组都不为空(在这种情况下,您将返回Integer.MIN_VALUE ,这是您想要的吗?)并且不可能有一个空的子数组(sum == 0)解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM