給你一個長度為 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);
}