題目:輸入一個整形數組,數組裏有正有負。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間複雜度爲O(n)。
分析:由時間複雜度可見,應該是遍歷一次就能找出最大和子數組的和。分析這樣的子數組的特徵,可得:這個最大子串和的初始值一定是從正數開始的(反證法可證)。代碼如下:
int maxsum(int *array, int n, int *result) {
int sum = 0, max = 0, i;
if (NULL == array)
return -1;
for (i = 0; i < n; i++) {
sum += array[i];
if (sum < 0)
sum = 0;
else if (sum > max)
max = sum;
}
*result = max;
return 0;
}
不足:沒有考慮輸入數組都是非正數的情況。