求最大子数组的和

问题:
给定一个数组a[0,…,n-1],数组元素有正有负,求其最大子数组(长度>=1)的和。

分析与解法:
如果不考虑时间复杂度,可以枚举出所有子数组并求和。但是由于长度为n的数组有O(n^2)个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n^3)。

很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,否则这个负数将会减少接下来的和。所以解法可以是如果当前和为负数,那么就放弃前面的累加和,从数组中的下一个数再开始计数,时间复杂度为O(n)。

int sum(int a[], int n)
{
    if(a != NULL && n != 0)
    {
        int i;
        int cSum, eSum;//cSum是当前和,eSum是最终和
        cSum = eSum = 0;
        for(i = 0; i < n; i++)
        {
            cSum += a[i];
            if(cSum < 0)//若cSum为负数,则清0
                cSum = 0;
            if(cSum > eSum)//若cSum的值大于eSum,则更新eSum
                eSum = cSum;
        }
        //若eSum值为0,即数组元素全为负数,则需要找出数组中的最大负数
        if(eSum == 0)
        {
            eSum = a[0];
            for(i = 1; i < n; i++)
            {
                if(eSum < a[i])
                    eSum = a[i];
            }
        }
        return eSum;
    }
}

思考题取出和最大的子数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值