題目描述:給定環形整數陣列(首尾相連),找出最大子陣列和。子陣列可以跨越陣列首尾。
解題思路:答案只有兩種情況:(1) 最大子陣列完全在陣列內部,用普通 Kadane 法;(2) 最大子陣列跨越首尾,等價於 total_sum - 最小子陣列和(排除中間最小部分)。取兩者最大值即為答案。邊界情況:若所有元素為負,(2) 的結果為 0(空陣列),應直接返回 (1) 的結果。
時間複雜度:O(n) — 單次遍歷同時計算最大與最小子陣列和。
空間複雜度:O(1) — 只使用常數個變數。
1. Initialize totalSum=0, maxSum=INT_MIN, curMax=0, minSum=INT_MAX, curMin=0 2. For each x in nums: a. curMax = max(curMax + x, x); maxSum = max(maxSum, curMax) b. curMin = min(curMin + x, x); minSum = min(minSum, curMin) c. totalSum += x 3. If maxSum <= 0: return maxSum (all negative, no wrap needed) 4. Return max(maxSum, totalSum - minSum)
單調佇列 O(n):前綴和 + 單調遞增佇列,維護最小前綴和以計算最大子陣列和(可處理環形),與本解法等效但更通用。
分治法 O(n log n):將陣列分成兩半,考慮跨越中點的子陣列,遞迴求解 — 正確但比 Kadane 慢。