Java Kadane'在O(N)中的最小和子阵;s算法
我们都知道最大和子阵和著名的。但是我们能用同样的算法来求最小和吗 我的看法是: 更改符号并在其中找到最大和,与计算最大和子阵列的方式相同。而不是改变这个标志 数组中的元素,使其处于初始状态。 如果算法有任何问题,请帮助我更正 角落案例:我知道如果所有元素都是正数,则会出现问题,我们可以通过执行一些预处理来处理这种情况,即如果所有元素都是+ve,则遍历数组,而不仅仅是从数组返回最小数 上面提到的算法将有效,并且得到了很好的支持(解释)。 我提到的方法能找到最小和吗 是的,会的。您可以将查找最小和的问题重新声明为查找具有最大绝对值的负和。当您切换数字的符号并保持算法的其余部分时,这就是算法将返回给您的数字 我知道如果所有的因素都是积极的,那就有问题了 不存在问题:当所有元素都是负的时,考虑原始KADAN算法。在这种情况下,算法返回零和的空序列-在这种情况下可能的最高值。换句话说,当所有元素都为负时,最好的解决方案是不接受任何元素 当所有数字都是正数时,修改后的算法也会这样做:同样,最好的解决方案是根本不取数字Java Kadane'在O(N)中的最小和子阵;s算法,java,arrays,algorithm,Java,Arrays,Algorithm,我们都知道最大和子阵和著名的。但是我们能用同样的算法来求最小和吗 我的看法是: 更改符号并在其中找到最大和,与计算最大和子阵列的方式相同。而不是改变这个标志 数组中的元素,使其处于初始状态。 如果算法有任何问题,请帮助我更正 角落案例:我知道如果所有元素都是正数,则会出现问题,我们可以通过执行一些预处理来处理这种情况,即如果所有元素都是+ve,则遍历数组,而不仅仅是从数组返回最小数 上面提到的算法将有效,并且得到了很好的支持(解释)。 我提到的方法能找到最小和吗 是的,会的。您可以将查找最小和的
如果您添加了从算法返回的范围不能为空的要求,您可以稍微修改算法,以找到最小的正数(或最大的负数),以防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);
}