给一组数,求最大子序列之和。
分析:因为是序列和,可能是数组中的任何连续子数组。但分析起来,存在三个位置:[left,right], (left,rigth),(left,right]。这三者中肯定有一种。
1.暴力解法:把每种组合都尝试下,当然时间复杂度为O(N^2);
int MaxsubSum1(int* arr, int n){
int maxSum = arr[0];
for (int i = 0; i < n; ++i){
int tempSum = 0;
for (int j = i; j < n; ++j){
tempSum += arr[i];
if (tempSum > maxSum){
maxSum = tempSum;
}
}
}
return maxSum;
}
2、当然还有好点的解法,就是书中提到的递归解法,当然也代码够复杂的。
3、下面是O(n)的解答:
int MaxsubSum(int* arr, int n){
int maxSum = arr[0];
int tempSum = 0;
for (int i = 0; i < n; ++i){
if (tempSum >= 0){
tempSum += arr[i];
}
else{
tempSum = arr[i];
}
if (tempSum > maxSum){
maxSum = tempSum;
}
}
return maxSum;
}