之前在网上查找最大连续和的O(n)算法的时候,发现大部分算法都比较复杂,而我想到了一个比较简单的方法。
思路:
1.a[i]+...+a[j]=s[j]-s[i-1];
2.当j固定时,s[j]-s[i-1]最大,即s[i-1]最小,
3.用一个vector sum存储a[0]加到a[i],再用一个minSum存储i之前从a[0]开始的最小连续和,sum[i]-minSum[i]表示最后一个元素是a[i]时的最大连续和,因此,所有的sum[i]-minSum[i]中的最大值就是最大连续和了。
下面是代码
<span style="font-size:18px;">#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;cin>>n;
vector<int>sum;
vector<int>minSum;
for(size_t i=0;i!=n;++i)
{
int temp;cin>>temp;
if(sum.empty())
{
sum.push_back(temp);
minSum.push_back(temp);
}
else
{
sum.push_back(sum.back()+temp);
minSum.push_back(sum.back()<minSum.back()?sum.back():minSum.back());
}
}
int maxSum=sum.front();
for(vector<int>::size_type i=0;i!=n;++i)
{
if(maxSum<sum[i]-minSum[i])
maxSum=sum[i]-minSum[i];
}
cout<<maxSum<<endl;
while(1);
}</span>