判断一个数组中最大子序列的和(Python)

判断一个数组中最大子序列的和(数组中存在负数),例如数组[1,2,-1,4,5]的最大子序列就是它本身,和为1。

利用动态规划的思想,求解子问题的最优解。

设置一个临时变量temp(用于保存临时子序列的累加和),将数组中从第一个数开始累加,如果加上一个新元素后,子序列的和temp大于res的值,则更新res的值;否则检查temp是否小于0,如果是,则令temp=0.

这里解释一下判断语句temp<0的作用:

   例如数组[1,2,3,4,5,-5,-6,1000],前五个累加的过程中,temp的值是不断变大的,但是紧接着出现两个负数,但是只要出现的负数没有把之前的正数累加和抵消到0,就还有可能在继续累加的过程中使得temp的值继续变大,例如两个负数后面,出现了一个正数1000,就使得temp的值立马变大了。     

    如果temp已经被抵消到小于0了,例如数组[1,2,3,-3,-2,-2,3,4],累加到第6个数时,temp已经小于0了,这6个数的和对于后面元素的累加已经没有益处了(不能使得序列的和变大了),则令temp=0,开始一个新的子序列的累加过程。

    此外temp<0还可以直接将新序列头部为负数的元素排除在外,例如数组[-3,-2,-2,3,4],前面的3个数将不会被计算在序列的累加和内。再例如数组[1,2,3,-3,-2,-1,-3,4],前6个元素的和已经为0,从第7个元素开始是一个新的序列,但是新序列开始就是负数-3,将直接被pass掉,不被计算在内。

def findMaxSum(num):
    temp = 0
    res = num[0]
    for i in range(0, len(num)):
        temp += num[i]
        if temp > res:
            res = temp
        elif temp < 0:
            temp = 0
    return res
if __name__=="__main__":
    num = [1,2,-1,4,5]
    print(findMaxSum(num))


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值