最大子序列问题
题目:给定一个整数列(可能有负数),求该整数列每个子序列的和的最大值,如果都为负数则结果为0;
例如:对于输入:-2,11,-4,13,-5,-2 ,答案为20(从11 到 13,即就是:11+(-4)+13=20 )
粗略代码如下(代码已测试通过):
#include <iostream> using namespace std; //arr:目标数组,length:数组长度 //方法一:复杂度为:O(N^3) int maxSubSum1(const int arr[],int length) { int maxSum=0; for(int i=0;i<length;i++) { for(int j=i;j<length;j++) { int thisSum=0; for(int k=i;k<=j;k++) //每次都是从i开始加到j,共i*(j-i)次 { thisSum+=arr[k]; } if(thisSum>maxSum) { maxSum=thisSum; } } } return maxSum; } //方法二:复杂度为:O(N^2) int maxSubSum2(const int arr[],int length) { int maxSum=0; for(int i=0;i<length;i++)//i表示当前序列起始点 { int thisSum=0; for(int j=i;j<length;j++)//j表示当前序列终点 { thisSum+=arr[j]; //推前一个则加一个数=累加 if(thisSum>maxSum) { maxSum=thisSum; } } } return maxSum; } //方法三:复杂度为O(N) int maxSubSum3(const int arr[],int length) { int maxSum=0,thisSum=0; for(int i=0;i<length;i++) { thisSum+=arr[i]; if(thisSum>maxSum) { maxSum=thisSum; } else if(thisSum<0) //如果累加结果为负数则从0开始,也就是从下一个数开始序列 { thisSum=0; } } return maxSum; } int main() { int arr[6]={-2,3,-4,13,-5,6}; //int result=maxSubSum1(arr,6); //int result=maxSubSum2(arr,6); int result=maxSubSum3(arr,6); cout<<result<<endl; }