数据结构课课后练习题,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)