簡體   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