我们都知道最大和子阵列和着名的Kadane's algorithm。但是我们可以使用相同的算法来找到最小和吗?
我的意思是:
更改符号并找到最大总和,与计算最大总和子阵列的方式相同。比改变标志了 数组中的元素使其处于初始状态。
如果有任何问题,请帮我纠正算法。
极端情况我知道如果所有元素都是正数就存在问题,我们可以通过执行一些预处理来处理这种情况,即如果所有元素都是+ ve而不是仅返回最小数字则遍历数组从阵列。
上述提法算法可以dasblinkenlight使用并得到很好的支持(解释)。
答案 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);
}