子数组最大和

今天温故了一道小题目:求子数组的最大和,要求时间复杂度是O(N)

其实算法很简单,但是第一个想到的人不简单,证明过程也不容易.

思路就是如果加上一个正数,和会越加越大,但是一旦碰到负数,加上一个负数,整个和就会减少,所以遇到负数,要及时更新,确保不会加到下面的正数和中,不然总和会小!

附上代码:

 
#include <stdio.h> 
int maxSum(int* a, int n)  
{  
    int sum=a[0];
    int b=0; 
    for(int i=0; i<n; i++)  
    {  
        if(b<0)           
            b=a[i];  
        else  
            b+=a[i];  
        if(sum<b)  
            sum=b;  
    }  
    return sum;  
}  
 
int main()  
{  
    int a[10]={1, -2, 3, 10, -4, 7, 2, -5};   
    cout<<maxSum(a,8)<<endl;  
    return 0;  
}  
 
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,
那么最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。 

全部是负数的情况也可以由sum=a[0]解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值