Kadane算法在O(N)中的最小和子阵列

时间:2013-08-27 18:09:10

标签: java arrays algorithm

我们都知道最大和子阵列和着名的Kadane's algorithm。但是我们可以使用相同的算法来找到最小和吗?

我的意思是:

  

更改符号并找到最大总和,与计算最大总和子阵列的方式相同。比改变标志了   数组中的元素使其处于初始状态。

如果有任何问题,请帮我纠正算法。

极端情况我知道如果所有元素都是正数就存在问题,我们可以通过执行一些预处理来处理这种情况,即如果所有元素都是+ ve而不是仅返回最小数字则遍历数组从阵列。

上述提法算法可以dasblinkenlight使用并得到很好的支持(解释)。

3 个答案:

答案 0 :(得分:8)

  

我提到的方法是否能找到最小金额?

是的,它会的。您可以重新说明找到最小和的问题,即找到具有最大绝对值的负和。当你切换数字的符号并保持算法的其余部分时,这就是算法将返回给你的数字。

  

我知道如果所有元素都是正面的话会有问题

不,没有问题:当所有元素都是负数时,请考虑原始的Kadane算法。在这种情况下,算法返回一个零序的空序列 - 在这种情况下可能的最高值。换句话说,当所有元素都是负数时,最好的解决方案就是不使用任何元素。

如果所有数字都是正数,您修改过的算法也会这样做:再次,您最好的解决办法就是不接受数字。

如果添加要求从算法返回的范围可能不为空,则可以稍微修改算法以找到最小的正数(或最大的负数),以防Kadane算法返回空范围为最佳解决方案。

答案 1 :(得分:1)

只需用最小值替换max。

//O(n)
public static int minSubArraySum(int[] arr) {
    int minSum = 0;
    int curSum = 0;
    for (int num : arr) {
        curSum += num;
        minSum = Math.min(minSum, curSum);
        curSum = Math.min(curSum, 0);
    }
    return minSum;
}

答案 2 :(得分:0)

static void subArraySumMin(int a[]) {
        int minendingHere = 0;
        int minSoFar = a[0];

        for (int i = 1; i < a.length; i++) {
            minendingHere = Math.min(a[i], minendingHere + a[i]);
            minSoFar = Math.min(minSoFar, minendingHere);
        }

        System.out.println(minSoFar);
    }