20180723剑指offer题31——连续子数组的最大和

本文探讨了如何在含有正负数的整型数组中找到最大连续子数组和的算法,通过动态规划的方法解决了该问题,并提供了代码实现及运行结果。

一、要求

输入一个整型数组,数组值有正有负,举个例子

输入:[1, -2, 3, 10, -4, 7, 2, -5]

其中的连续子数组3,10,-4,7,2  得到最大和18

二、思路及代码

这个数组有正有负,那么最大和至少为正数,有点赌徒心态:

(1)假设一段连续子数组的和是正数,那么就有涨的希望,下一个是正是负没关系,都先存起来

(2)假设一段连续子数组的和是负数,跌停了,不要了

(3)每来一个新数字,计算一下连牌和,看看要不要换新的最大和max

旧的正current+正数>正数>旧的负current+正数

用两个变量,res存储目前为止的最大和,current存储现在赌徒的和

current为正:res=max(res,crrrent+new)

current为负:res=max(res,new)

def max_sum(a):
    current=0
    res=float("-inf")
    for new in a:
        if current<=0:
            current=new

        else:
            current+=new
        res=max(res,current)
    return res


a= [1, -2, 3, 10, -4, 7, 2, -5]
print(max_sum(a))

三、运行结果

18

  

四、思考与总结

1.python的无穷

Python中可以用如下方式表示正负无穷: float("inf"), float("-inf") 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值