最大连续子序列

来源:互联网 发布:英国脱离欧盟 知乎 编辑:程序博客网 时间:2024/05/21 10:58

最大连续子序列是找出由数组成的一维数组中和最大的连续子序列。比如,[5,-3,4,2]的最大子序列就是[5,-3,4,2],其和为8。而[5,-6,4,2]的最大子序列为[4,2],其和为6。其实,寻找最大子序列的方法很简单,只要前i项的和还没有小于0,那么子序列就一直向后扩展。否则就丢弃之前的子序列开始新的子序列。在扩展的同时,每扩展一位就要记下当前的连续子序列的和并与最大值进行比较,最终找到和最大的子序列。

具体实现代码如下:

>>> def maxSubSum(a):maxSum = 0currSum = 0newBegin = 0begin = 0end = 0for index,value in enumerate(a):currSum += valueif currSum>maxSum:maxSum = currSumbegin = newBeginend = indexif currSum < 0:currSum = 0newBegin = index + 1return maxSum,begin,end>>> lista=[1,2,3,4,-10,3,4,-3]>>> maxSum,begin,end=maxSubSum(lista)>>> maxSum10>>> begin0>>> end3

但是,这样求值存在一个问题,就是当序列变为全负数时,求解时不正确的。

>>> lista=[-3,-1,-4]>>> maxSum,begin,end=maxSubSum(lista)>>> maxSum0

此时,需要做出如下修改,将maxSum初始化为列表的第一个值:

>>> def maxSubSum(a):maxSum = a[0]currSum = 0newBegin = 0begin = 0end = 0for index,value in enumerate(a):currSum += valueif currSum>maxSum:maxSum = currSumbegin = newBeginend = indexif currSum < 0:currSum = 0newBegin = index + 1return maxSum,begin,end>>> lista=[-3,-1,-4]>>> maxSum,begin,end=maxSubSum(lista)>>> maxSum-1>>> begin1>>> end1

其实在实现的时候有一种更简练的写法如下:

>>> def maxSumSum(a):m = a[0]n = a[0]for index in range(1,len(a)):  #此处从1开始遍历m = max(a[index],m+a[index])   #比较(当前值,当前值+包含前一个值的最大值),如果后者小于0,则从当前值开始往后遍历。n = max(m,n) #每遍历一个值则比较一下最大值,并保存在变量n中。return n>>> lista=[-3,-1,-4]>>> maxSumSum(lista)-1>>> lista=[1,2,3,4,-10,3,4,-3]>>> maxSumSum(lista)10


0 0
原创粉丝点击