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
扫一扫 关注我的公众号或者微信搜索每日一算法关注我,每天都有哦
如果你想要跟大家分享你的文章,欢迎留言投稿~
如果你喜欢,请留下你的赞哦