算法题解-01:最大子列和问题

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 查看本文章

完美解决问题。

发布了51 篇原创文章 · 获赞 36 · 访问量 1354

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104491238
今日推荐