0x01.题目详情
具体点这前往:戳我前往
0x02.多种思路
抓住题目关键,子列和,于是一种暴力的解题方法就此出现,没错,遍历所有的子列找出当中和最大的。
遍历子列的关键就是,假设一个子列的左端点不动,一直移动右端点,在这个过程中,不断的更新最大的子列和,直到遍历完所有的子列。
主函数:
int main()
{
int a[100000];
int k;
scanf("%d",&k);
int i;
for(i=0;i<k;i++)
scanf("%d",&a[i]);
printf("%d",MaxSubseqSum1(a,k));
}
方法一:暴力解题 O(n2)
int MaxSubseqSum1(int*a,int k)
{
int i,j,max,temp;
temp=max=0;
for(i=0;i<k;i++)
{
temp=0;
for(j=i;j<k;j++)
{
temp+=a[j];
if(temp>max)
{
max=temp;
}
}
}
return max;
}
要注意一点的就是,每次开始移动左端点,就要重置temp为0。
完美通过:
虽然通过了,但最后一个测试点的耗时还是太长了。
于是开始对这个方法进行改进。
发现在求子列和的最大值的时候,如果当前计算的子列和是负数,那么对于新加入的元素的话,只会越加越少,这时,我们就可以重置temp,重新开始计算当前子列,相当于不断更新,而且max中,已经保存了之前的最大值,就能不需要考虑是否之前的还是更大的问题。
方法二:在线处理 O(n)
int MaxSubseqSum2(int*a,int k)
{
int i,max,temp;
temp=max=0;
for(i=0;i<k;i++)
{
temp+=a[i];
if(temp>max)
{
max=temp;
}
else if(temp<0)
{
temp=0;
}
}
return max;
}
扫描二维码关注公众号,回复:
9393308 查看本文章
完美解决问题。