子数组的最大累加和问题

1:题目

给定一个数组array,返回子数组的最大的累加和。

举例说明:

若array=[1,3,-6,5,7,-4],所有的子数组中,[5,7]可以累加出最大的和是12,所以返回12

 

2:要求

a:时间复杂度为O(n),空间复杂度为O(1)

 

3:解答

1):如果array全是负数,那么产生的最大累加和一定是数组中的最大的那个值。

2):如果array全是正数,那么产生的最大值是所有数相加产生的和。

3):如果array中既有正数又有负数,我们可以从左到右遍历array数组,设定有一个变量current记录每一步相加的和,遍历到正数的时候,current数增加,遍历到负数的时候,current数减少。

4):用一个max变量全程记录相加得到的最大值,当current<0的时候,说明当前累加和的结果肯定不是最大的值,此时令current=0,表示从下一个数重新开始累加。

我们以上面数组array=[1,3,-2,5,7,-4]为例:

当开始执行的时候,array=[1,3,-6,5,7,-4],max=Integer.Min,current=0。

当遍历到1的时候,current=1,max=1;

当遍历到3的时候,current=4,max=4;

当遍历到-6的时候,current=-2,因为current=-2<0,所以最大值肯定不会是它,令current=0,重新开始下个数累加,因为max=4>-2,所以不更新max的值,max的值还是4;

当遍历到5的时候,current=5,max=4<5,所以更新max的值为5;

当遍历到7的时候,current=12,max=5<12,所以更新max的值为12;

当遍历到-4的时候,current=8,max=12>8,所以不更新max的值。

所以返回的最大值等于12。

 

4:代码

 

 

代码地址:https://github.com/1260380285/suanfa/blob/yuanbing/src/com/MaxSum.java

 

 

扫一扫 关注我的公众号或者微信搜索每日一算法关注我,每天都有哦

如果你想要跟大家分享你的文章,欢迎留言投稿~

如果你喜欢,请留下你的赞哦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值