我正在查看几天前完成的任务,意识到我不应该使用常量。该分配是众所周知的“使用分而治之方法递归地找到正负两个整数的子数组的最大和”。我的算法有效,但其中一部分使用常数以找出包括数组中间在内的最大子数组之和。
以下是相关代码:
lfSum = Integer.MIN_VALUE;
sum = 0;
// Sum from left to mid
for (int i = mid; i >= LF; i--) {
sum += array[i];
if (sum > lfSum) {
lfSum = sum;
if (lfSum > lfMax) {
lfMax = lfSum;
}
}
}
rtSum = Integer.MIN_VALUE;
sum = 0;
// Sum from mid to right
for (int j = mid+1; j <= RT; j++) {
sum += array[j];
if (sum > rtSum) {
rtSum = sum;
if (rtSum > rtMax) {
rtMax = rtSum;
}
}
}
// Largest sum spanning whole array
midMax = lfSum + rtSum; // midMax = leftMid + midRight;
它的作用是遍历整个数组的每一半,并检查总和是否大于整个数组为负数时可能的最小整数。如果是,它将那一方的最大和设置为和的值。如果该值大于一个递归调用返回的值(lfMax或rtMax),请为其设置相应端的递归值。
就像我之前说过的那样,这很好用,但是我不应该使用“ Integer.MIN_VALUE”。还有其他解决方法吗?显然,我可以将lfSum / rtSum初始化为Integer.MIN_VALUE的数值,但是我想知道是否还有其他选项。
我尝试删除rtSum / lfSum并仅将sum与递归值进行比较,然后将lfSum / rtSum初始化为0,但两者均无法正常工作。感谢您抽时间阅读!
最佳答案
您可以将lfSum
初始化为null
:
Integer lfSum = null;
并修改if条件,如下所示:
if (lfSum == null || (lfSum != null && sum > lfSum.intValue())) {
lfSum = sum;
if (lfSum > lfMax) {
lfMax = lfSum;
}
}
类似的策略适用于
rtSum
。