首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

LeetCode 53. 最大子數組和:Kadane 算法 O(n) 動態規劃解法詳解

     編輯:關於C語言

LeetCode 53. 最大子數組和:Kadane 算法 O(n) 動態規劃解法詳解

尋找數組中連續子數組的最大和。本文詳解 **Kadane 算法** 核心思想:以 `dp[i]` 表示以 `i` 結尾的最大子數組和,狀態轉移 `dp[i] = max(nums[i], dp[i-1] + nums[i])`,空間優化為 O(1),並分析全負數邊界、分治法對比與變體擴展。

算法核心:動態規劃狀態定義

`dp[i]` = 以索引 `i` 結尾的連續子數組的最大和。
兩種選擇:

  1. 單獨以 `nums[i]` 開始新子數組。
  2. 延續之前的子數組:`dp[i-1] + nums[i]`。

取最大:`dp[i] = max(nums[i], dp[i-1] + nums[i])`。
答案 = `max(dp[0..n-1])`。

空間優化:滾動變量

只需保留 `dp[i-1]`(即 `cur_max`)和全局最大 `global_max`。

C 語言實現(標準 Kadane)

#include  // INT_MIN

int maxSubArray(int* nums, int numsSize) {
    int cur_max = nums[0];
    int global_max = nums[0];

    for (int i = 1; i < numsSize; i++) {
        // 狀態轉移:延續還是重新開始
        cur_max = (cur_max > 0) ? cur_max + nums[i] : nums[i];
        // 等價:cur_max = fmax(cur_max + nums[i], nums[i]);
        // 更新全局最大
        if (cur_max > global_max) global_max = cur_max;
    }
    return global_max;
}

關鍵點解析

  • 初始化用 `nums[0]` 而非 0/INT_MIN:正確處理全負數數組(如 `[-2,-1]` 答案為 -1)。若初始化 0,全負數會誤返回 0(空子數組,題目要求至少一個元素)。
  • `cur_max > 0` 判斷比 `fmax` 更快**:避免函數調用開銷,邏輯清晰:前綴和為正則有增益,為負則拖累,捨棄重來。
  • 單次遍歷、無分支錯誤預測失敗**:極適合流水線 CPU,實際運行極快。

分治法對比(教學用,非最優)

分治:最大子數組在左半、右半、或跨中間。跨中間需從中向左/右掃描最大前/後綴和。時間 O(n log n),空間 O(log n) 遞歸棧。Kadane O(n) 完勝。

變體擴展

變體修改點
返回子數組索引 [l, r]記錄 `cur_max` 更新時的起始索引,`global_max` 更新時的最佳區間
環形數組最大子數組和答案 = max(普通最大和, 總和 - 最小子數組和) (排除全負數情況)
最大子矩陣和 (2D)枚舉上下行邊界,壓縮列和為 1D 數組,套用 Kadane → O(n³)
k 不相交最大子數組和DP[i][k] = max(DP[i-1][k], max_j(DP[j-1][k-1] + sum(j..i))) → O(n²k) 可優化

測試用例

[-2,1,-3,4,-1,2,1,-5,4] → 6  (子數組 [4,-1,2,1])
[1] → 1
[5,4,-1,7,8] → 23
[-2,-1] → -1
[-1,-2,-3] → -1
[0,-1,0] → 0

常見錯誤避坑

  1. **初始化 `cur_max = 0, global_max = INT_MIN`**:全負數數組返回 0(空子數組),違反「至少一個元素」。
  2. **用 `cur_max += nums[i]` 後 `if (cur_max < 0) cur_max = 0`**:同樣導致全負數返回 0。
  3. **忘記 `#include `** 使用 `INT_MIN` 編譯報錯。
  4. **誤以為需雙層循環**:暴力 O(n²) 會超時,Kadane 單層 O(n) 為正解。

總結

最大子數組和是**動態規劃入門神題**,Kadane 算法以「局部最優推導全局最優」的優雅邏輯,實現 O(n) 時間 O(1) 空間極致優化。掌握「狀態定義 `dp[i]`、轉移方程 `max(nums[i], dp[i-1]+nums[i])`、滾動優化、全負數初始化」四大核心,即可舉一反三解決子數組/子矩陣/不相交子數組等系列進階問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved