Solution 1:
计算数组可以构成的所有子序列的和,然后求最大和,复杂度为O(N^3),最终结果运行超时。
#include<iostream>
#include <vector>
using namespace std;
int main()
{
int num;
cin>>num;
vector<int> ivec;
int t;
while (cin>>t)
{
ivec.push_back(t);
}
int theMax=0, p, q;
int negNum=0;
for (int i=0;i<num;i++)
{
if(ivec[i]<0)
negNum++;
for (int j=i;j<num;j++)
{
int sum=0;
for (int k=i;k<=j;k++)
{
sum+=ivec[k];
}
if(sum>theMax)
{
theMax=sum;
p=ivec[i];
q=ivec[j];
}
}
}
if (negNum==num)
{
theMax=0;
p=ivec[0];
q=ivec[num-1];
}
cout<<theMax<<' '<<p<<' '<<q<<endl;
system("pause");
return 0;
}
Solution 2:
计算每个元素开头的子序列的最大和,并求最大和的最大值,复杂度为O(N^2),运行通过
#include<iostream>
#include <vector>
using namespace std;
int main()
{
int num;
cin>>num;
vector<int> ivec;
int t;
while (cin>>t)
{
ivec.push_back(t);
}
int theMax=0, p, q;
int negNum=0;
for (int i=0;i<num;i++)
{
if(ivec[i]<0)
negNum++;
int sum=0;
for (int j=i;j<num;j++)
{
sum+=ivec[j];
if(sum>theMax)
{
theMax=sum;
p=ivec[i];
q=ivec[j];
}
}
}
if (negNum==num)
{
theMax=0;
p=ivec[0];
q=ivec[num-1];
}
cout<<theMax<<' '<<p<<' '<<q<<endl;
system("pause");
return 0;
}
Solution 3:
利用递归,复杂度O(NlogN),不能给出子序列的开始数字和结尾数字。
#include<iostream>
#include <vector>
using namespace std;
int maxSubSum(const vector<int> & vec, int left, int right)
{
if(left==right)
if(vec[left]>0)
return vec[left];
int mid=(left+right)/2;
int maxLeftSum=maxSubSum(vec,left,mid);
int maxRightSum=maxSubSum(vec,mid+1,right);
int maxLeft=0,leftSum=0;
for (int i=mid;i>=left;i--)
{
leftSum+=vec[i];
if(maxLeft<leftSum)
maxLeft=leftSum;
}
int maxRight=0,rightSum=0;
for(int i=mid;i<right;i++)
{
rightSum+=vec[i];
if(maxRight<rightSum)
maxRight=rightSum;
}
int maxMidSum=maxLeft+maxRight;
int max=maxLeftSum>=maxMidSum?maxLeftSum:maxMidSum;
max=max>=maxRight?max:maxRight;
return max;
}
int main()
{
int num;
cin>>num;
vector<int> ivec;
int t;
while (cin>>t)
{
ivec.push_back(t);
}
int theMax=0;
int negNum=0;
for (int i=0;i<num;i++)
{
if(ivec[i]<0)
negNum++;
}
theMax=maxSubSum(ivec,0,num-1);
if (negNum==num)
{
theMax=0;
}
cout<<theMax<<endl;
system("pause");
return 0;
}
Solution 4:
从一个数开始相加,保存最大和,如果加到某一个数后结果为负的,则从这一位之后开始相加,保存最大和,直到最后。复杂度O(N)。
#include<iostream>
#include <vector>
using namespace std;
int main()
{
int num;
cin>>num;
vector<int> ivec;
int t;
while (cin>>t)
{
ivec.push_back(t);
}
int theMax=0,p,q;
int negNum=0;
int temp=0,x=0;
for (int i=0;i<num;i++)
{
if(ivec[i]<0)
negNum++;
temp+=ivec[i];
if (temp<=0)
{
temp=0;
if (i+1<num)
x=i+1;
}
if(theMax<temp)
{
theMax=temp;
p=ivec[x];
q=ivec[i];
}
}
if (negNum==num)
{
theMax=0;
p=ivec[0];
q=ivec[num-1];
}
cout<<theMax<<' '<<p<<' '<<q<<endl;
system("pause");
return 0;
}