最大连续子序列
来源:互联网 发布:英国脱离欧盟 知乎 编辑:程序博客网 时间: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
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- div,p,span,ul,li,dl,dt,dd,a,img,h,strong,em用法
- 手机传感器调研
- postgres 9.4 新特性文章
- 第二部分、处理海量数据问题之六把密匙
- 小飞的电梯调度算法
- 最大连续子序列
- 分布式事务
- oracle共享服务器模式配置
- iOS学习笔记(十六)——数据库操作(使用FMDB) .
- nodejs中Async库介绍
- 1411211846-hd-Big Event in HDU
- HDU—— 1019 Least Common Multiple
- Java面试题:请说说MVC架构
- 关联矩阵