复杂度2 Maximum Subsequence Sum

数据结构课课后练习题,Python实现。

最大的难点在于如何记录子列的首尾数字。尾数b很好做,只要和最大子列和一起更新即可;第一个数a比较难,先赋值为整个序列的第一个数,在每次抛弃左端数据时更新c值,最后在更新最大子列和时记录当前的c为a值。

但花时间最长的点并不是上面这点,而是只包含0和负数的情景一直没搞懂后两个数输出什么。输出序列第一个和最后一个不对,输出第一个数(即i,j最小)也不对,参考别人答案才发现是要输出0(泪目)

#最大子列和问题,输出最大子列首尾数字
def MSS(ar,k):
    MaxSum = ThisSum = d = 0
    a = b = c = ar[0]
    for i in range(k):
        ThisSum += ar[i]
        if ThisSum > MaxSum:
            MaxSum = ThisSum #更新最大子列和
            b = ar[i] #最大子列右端点值
            a = c #最大子列左端点值
        elif ThisSum < 0:
            ThisSum = 0
            if i < k - 1:
                c = ar[i+1] #子序列和为负数时,抛弃该段,以下一个值为起始点
        elif ThisSum == 0: #input只包含0和负数时,计算0的个数
            d += 1
    if MaxSum == 0:
        if d == 0:
            b = ar[-1] #input只含负数时,输出 0 第一个数 最后一个数
        else:
            a = b = 0 #input只包含0和负数时,输出 0 0 0
    print('%d %d %d' % (MaxSum,a,b))
k = int(input())
ar = input().split()
ar = [int(ar[j]) for j in range(k)]
MSS(ar,k)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值