版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37701443/article/details/84495837
1.问题描述
假设有一数组(python里为list啦)[1,3,-3,4,-6,-1],求数组中最大连续子序列的和。例如在此数组中,最大连续子序列的和为5,即1+3+(-3)+4 = 5
2.O(n2)的解法
最简单粗暴的方式,双层循环,用一个maxsum标识最大连续子序列和。然后每次判断更新。没有太多可以说的,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def maxSum( list ): maxsum = list [ 0 ] for i in range ( len ( list )): maxtmp = 0 for j in range (i, len ( list )): maxtmp + = list [j] if maxtmp > maxsum: maxsum = maxtmp return maxsum if __name__ = = '__main__' : list = [ 1 , 3 , - 3 , 4 , - 6 ] maxsum = maxSum( list ) print "maxsum is" ,maxsum |
运行结果
3.O(n)解法
在任何讲动态规范的地方都能找到求最大连续子序列和的例子。具体来说,假设数组为a[i],因为最大连续的子序列和必须是在位置0-(n-1)之间的某个位置结束。那么,当循环遍历到第i个位置时,如果其前面的连续子序列和小于等于0,那么以位置i结尾的最大连续子序列和就是第i个位置的值即a[i]。如果其前面的连续子序列和大于0,则以位置i结尾的最大连续子序列和为b[i] = max{ b[i-1]+a[i],a[i]},其中b[i]就是指最大连续子序列的和。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
def maxSum(list_of_nums): maxsum = 0 maxtmp = 0 for i in range ( len (list_of_nums)): if maxtmp < = 0 : maxtmp = list_of_nums[i] else : maxtmp + = list_of_nums[i] if (maxtmp > maxsum): maxsum = maxtmp return maxsum if __name__ = = '__main__' : list_of_num = [ 1 , 3 , - 3 , 4 , - 6 ] maxsum = maxSum(list_of_num) print "maxsum is: " ,maxsum |
运行结果