文章目錄
知道这题,是在冼镜光的《C名题精选百则》中。记得这题是自己做出来的,所以稍微回忆一下,就能记起来。也许算法之所以这么难,就是因为不是自己想出来的,所以虽然看过,却很容易忘记。或许应该不只是看算法,而要知道原始作者的思考过程,这样才能真正理解。就像要想理解TCP/IP协议一样,比较好的办法是自己去设计TCP协议,看如何保证可靠传输。扯远了。
对于这题,很容易写出如下程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def max_con_sum(s): length = len(s) max_sum = s[0] i = 0 temp_sum = s[0] while i + 1 < length: i += 1 if temp_sum < 0: temp_sum = 0; temp_sum += s[i] if temp_sum > max_sum: max_sum = temp_sum
return max_sum L = [2,-3,3,50] print max_con_sum(L)
|
而如果还想知道最大连续子序列的开始位置和结束位置,之需要再增加额外的记录信息即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| def max_con_sum(s): length = len(s) max_sum = s[0] start = 0; end = 0 i = 0 temp_sum = s[0] while i + 1 < length: i += 1 if temp_sum < 0: temp_sum = 0; start = i temp_sum += s[i] if temp_sum > max_sum: max_sum = temp_sum end = i
return (max_sum,start,end) L = [2, -3, 3, 50] max_sum,start,end = max_con_sum(L) print max_sum,start,end
|