【问题标题】:Linear time algorithm for Maximum contiguous sub-array sum最大连续子数组和的线性时间算法
【发布时间】:2018-08-19 10:08:57
【问题描述】:

我一直在解决算法简介 - CLRS 中的练习,并且遇到了在线性时间内求解最大连续子数组(Q 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;
}

除了将手动测试用例输入程序之外,还有其他方法可以检查该算法的有效性吗?

【问题讨论】:

  • 那么你的问题是什么?
  • 请注意“Stack Overflow 不是论坛”。 (来自tour 页面)所以,请提出问题。
  • 如果所有数组元素都是负数,人们可以争论正确的输出是什么。一个可能的答案是 0(对于空子数组)。

标签: java algorithm kadanes-algorithm


【解决方案1】:

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

如果您不将空子数组视为可能的解决方案,那么是的,您的解决方案是正确的,实际上它与 Kadane's algorithm 完全相同。

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) 是不可能的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2021-01-21
    • 2020-01-22
    • 1970-01-01
    • 2013-09-13
    • 2021-09-25
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多