连续子数组的最大和(Python)

问题:连续子序列最大和 
给定一个数字序列[A1A2A3…An],求i,j(1<=i<=j<=n)使得Ai…Aj和最大, 
输出这个最大和(连续大子序列最大和) 
例如: 
输入: 
L=[-2 ,6, -1, 5, 4, -7, 2, 3] 
输入: 
14 (即6,-1,5,4这个序列的和)

思路:
最大和连续子数组一定有如下几个特点:
1、第一个不为负数
2、如果前面数的累加值加上当前数后的值会比当前数小,说明累计值对整体和是有害的;如果前面数的累加值加上当前数后的值比当前数大或者等于,则说明累计值对整体和是有益的。
步骤:
1、定义两个变量,一个用来存储之前的累加值,一个用来存储当前的最大和。遍历数组中的每个元素,假设遍历到第i个数时:
①如果前面的累加值为负数或者等于0,那对累加值清0重新累加,把当前的第i个数的值赋给累加值。
②如果前面的累加值为整数,那么继续累加,即之前的累加值加上当前第i个数的值作为新的累加值。
2、判断累加值是否大于最大值:如果大于最大值,则最大和更新;否则,继续保留之前的最大和

 

def function(lists):
    max_sum = lists[0]
    pre_sum = 0
    for i in lists:
        if pre_sum < 0:
            pre_sum = i
        else:
            pre_sum += i
        if pre_sum > max_sum:
            max_sum =  pre_sum
    return max_sum
 
def main():
    lists=[6,-3,1,-2,7,-15,1,2,2]
    print function(lists)
    
if __name__ == "__main__":
    main()

容易看出,这个算法的时间复杂度为o(n)

最后提一下,还有一个算法的时间复杂度为o(nlogn),这个算法是分治法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值