1

我正在查看几天前完成的作业,并意识到我不应该使用常量。分配是众所周知的“使用分而治之的方法递归地找到正负整数子数组的最大和”问题。我的算法有效,但它的一部分使用一个常量来计算包含数组中间的子数组的最大总和。

以下是相关代码:

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,但两者都无法正常工作。感谢您抽时间阅读!

4

1 回答 1

1

您可以初始化lfSumnull

Integer lfSum = null;

并像这样修改 if 条件:

if (lfSum == null || (lfSum != null && sum > lfSum.intValue())) {
    lfSum = sum;
    if (lfSum > lfMax) {
        lfMax = lfSum;
    }
}

类似的策略适用于rtSum.

于 2013-03-03T22:33:20.153 回答