基于 Kadane 算法的 O(N) 中的最小和子数组

2022-09-03 07:30:48

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

我的看法是:

更改符号并找到其中的最大和,与我们计算最大和子数组的方式相同。比更改数组中元素的符号以使其处于初始状态。

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

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

上面提到的算法将工作,并且dasblinkenlight得到了很好的支持(解释)。


答案 1

我提到的方法是否有助于找到最小金额?

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

我知道如果所有元素都是积极的,就会有问题

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

当所有数字都是正数时,你修改后的算法也会做同样的事情:同样,你最好的解决方案是根本不取数字。

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


答案 2
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);
    }