求最大连续子序列的和是一个很经典很古老的面试题了,记得在刚毕业找工作面试那会也遇到过同款问题。今儿突然想起来,正好快到毕业季,又该是苦逼的应届生们各种面试的时候到了,就给写了一些小代码解决这个问题。也希望各位找工作的同志们都拿到心目中理想的offer,从此以后,战胜高富帅,赢取白富美,走上人生巅峰。
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 |
运行结果
1
|
maxsum is 5 |
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 |
运行结果
1
|
maxsum is 5 |
总结
以上就是本文关于Python语言描述最大连续子序列和的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/bitcarmanlee/article/details/51526010