【C++】最大連續子序列和 (Max Subarray)

給你一個長度為 n 的陣列,請找出最大的連續子序列和。
舉例:{-2, 1, -6, 2, 1} 的最大子序列和是 {2, 1} = 3。

解法1:暴力

時間複雜度:O(n3)。(n 大於 500 時可能會 TLE)

int maxSum = a[0];
for(int i=0; i<n; i++){
    for(int j=i; j<n; j++){
        int sum = 0;
        for(int k=i; k<=j; k++){
            sum += a[k];
        }
        maxSum = max(maxSum, sum);
    }
}

解法2:Kadane’s Algorithm (卡丹算法)

時間複雜度:O(n)。
核心想法:在每一步中,我們可以選擇將當前元素加入到目前的子序列中,或是開始一個新的子序列。

int maxSum = a[0];
int sum = a[0];
for(int i=1; i<n; i++){
    sum = max(a[i], sum + a[i]);
    maxSum = max(maxSum, sum);
}
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *