繁体   English   中英

子阵列最大和

[英]Sub-Array Max Sum

我正在查看几天前完成的作业,发现我不应该使用常量。 该分配是众所周知的“使用分而治之方法递归地找到正负两个整数的子数组的最大和”。 我的算法有效,但是它的一部分使用常量以便找出包括数组中间在内的最大子数组之和。

以下是相关代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM