1 连续子序列之和最大
给一个数组,返回它的最大连续子序列的和,例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。
1.1 一般方法:用两层循环
最大和变量:max_list = [ ]
从第0个位置6开始,依次往后计算连续和,并求出最大的和。6 ,3, 1 ,8, -7,-6,-4, -2 ;最大和为8,即max_list = [8]
第1个位置-3开始,依次往后计算连续和,并求出最大的和。 -3,-5, 2, -13, -12, -10, -8 ;最大和为2,即max_list = [8,2]
。。。
最后位置2,最大和为2,即max_list = [8,2,。。。2]
然后求出max_list中最大的元素,即为最大连续之和
但是在编码实现时,不是先求出中间值序列,再求最大值。而是一边计算连续序列,一边和最大值比较,如果比最大值大,就替换掉最大值。
class Solution:
def FindGreatestSumOfSubArray(self, array):
# write code here
max_sum = array[0]
for i in range(len(array)):
max_tmp = 0
for j in range(i,len(array)):
max_tmp += array[j]
if max_tmp > max_sum:
max_sum = max_tmp
return max_sum
1.2 动态规划
动态规划最难的就是找出状态转移方程。
lis = [6,-3,-2,7,-15,1,2,2]
只有一个数6,最大连续和为6
6,-3 ,一眼看出是6。过程是,连续和是6+(-3)=3 ,3, 6, -3,比较,最大的是6
这里比较的三个数,抽象出来就是,连续子和,前一个最大数,当前数,这三个数比较就行了。
连续子和与当前数都是暂时的,最大数是两者比较出来的
如果前一个连续子和dp[i-1]<0,加上当前数A[i],只能更小,比A[i]还小,这样两者之间最大数就是A[i]
如果前一个连续子和dp[i-1]>=0,加上当前数A[i],只能更大,比A[i]还大或相等,这样两者之间最大数就是dp[i-1] + A[i]
这两种暂时的较大值赋值给max_tmp = max{dp[i-1]+A[i] , A[i]}
然后求max_tmp的最大值
class Solution:
def FindGreatestSumOfSubArray(self, array):
# write code here
max_sum = array[0]
max_tmp = 0
for i in range(len(array)):
if max_tmp>=0:
max_tmp += array[i]
else:
max_tmp = array[i]
if max_tmp > max_sum:
max_sum = max_tmp
return max_sum