一、暴力求解
时间复杂度为n^2
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
int a[10002],maxx,sum,n;
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
maxx = -inf
for(int i=0;i<n;++i)
{
sum = 0;
for(int j=i;j<n;++j)
{
sum += a[j];
maxx=max(sum,maxx)
}
}
printf("%d\n",maxx);
}
优化
时间复杂度n
该方法优化的基于的思想就是,最大连续子序列的开始一段的序列肯定不会是负数。
比如i……j……n是最大连续子序列的话,那么i+….+j肯定大于0,否则,我们就可以把这一段序列去掉换来更大的和。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
int a[10002],maxx,n,sum;
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
sum = 0;
maxx = -inf;
for(int i=0;i<n;++i)
{
if(sum<=0)//如果前面的和为负,则前面的序列舍掉从本元素开始重新确定新序列
sum = a[i];
else//如果前面的和为正,则可能出现在最大序列中,所以要继续累加
sum += a[i];
maxx=max(maxx,sum)
}
printf("%d\n",maxx);
return 0;
}
本文介绍了两种求解最大连续子序列和的方法:暴力求解和优化算法。暴力求解的时间复杂度为O(n^2),通过遍历所有可能的子序列来找到最大和;优化算法的时间复杂度为O(n),利用了最大连续子序列开始部分不会为负数的特性,通过一次遍历即可找出最大和。
588

被折叠的 条评论
为什么被折叠?



