Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kadane'在O(N)中的最小和子阵;s算法_Java_Arrays_Algorithm - Fatal编程技术网

Java Kadane'在O(N)中的最小和子阵;s算法

Java Kadane'在O(N)中的最小和子阵;s算法,java,arrays,algorithm,Java,Arrays,Algorithm,我们都知道最大和子阵和著名的。但是我们能用同样的算法来求最小和吗 我的看法是: 更改符号并在其中找到最大和,与计算最大和子阵列的方式相同。而不是改变这个标志 数组中的元素,使其处于初始状态。 如果算法有任何问题,请帮助我更正 角落案例:我知道如果所有元素都是正数,则会出现问题,我们可以通过执行一些预处理来处理这种情况,即如果所有元素都是+ve,则遍历数组,而不仅仅是从数组返回最小数 上面提到的算法将有效,并且得到了很好的支持(解释)。 我提到的方法能找到最小和吗 是的,会的。您可以将查找最小和的

我们都知道最大和子阵和著名的。但是我们能用同样的算法来求最小和吗

我的看法是:

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

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

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

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

我提到的方法能找到最小和吗

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

我知道如果所有的因素都是积极的,那就有问题了

不存在问题:当所有元素都是负的时,考虑原始KADAN算法。在这种情况下,算法返回零和的空序列-在这种情况下可能的最高值。换句话说,当所有元素都为负时,最好的解决方案是不接受任何元素

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


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

只需将最大值替换为最小值即可

//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;
}
static void子数组总和(int a[]{
int minendingHere=0;
int minSoFar=a[0];
for(int i=1;i
如果所有元素都为正,为什么不起作用?在这种情况下,空序列的最小和是0,这将被正确地找到。@Henry-他可能想找到某个k的大小为k的子数组的最小和≤ 在这种情况下,我们可以遍历数组,如果我们看到所有元素都是+ve,那么我们可以取元素的最小值,这比重新调整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);
    }