我正在查看我几天前完成的任务,并意识到我不应该使用常量。赋值是众所周知的“使用分而治之的方法递归地找出正和负的整数子数组的最大和”问题。我的算法有效,但是它的一部分使用常量来计算出包含数组中间的子数组的最大总和。
以下是相关代码:
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,但两者都无法正常工作。感谢您抽出宝贵时间阅读本文!
答案 0 :(得分:1)
您可以将lfSum
初始化为null
:
Integer lfSum = null;
并修改if条件:
if (lfSum == null || (lfSum != null && sum > lfSum.intValue())) {
lfSum = sum;
if (lfSum > lfMax) {
lfMax = lfSum;
}
}
类似的策略适用于rtSum
。