最大子序列问题
题目:给定一个整数列(可能有负数),求该整数列每个子序列的和的最大值,如果都为负数则结果为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;
}

浙公网安备 33010602011771号