首先分治算法求解不连续的最大子序列
分治算法步骤:
1.将问题分解为若干简单的子问题
2.通过递归寻求各个子问题的解
3.合并各个子问题的解,从而得到原始问题的解
首先对于求解连续最大子序列问题而言,将序列划分为左、右两部分,连续最大序列和的分布有三种情况。
第一种:存在于左边序列
第二种:存在右边序列
第三种:跨界的序列
首先先定义比较三个数大小的函数,其次再写寻找最大子序列和的函数,在函数中求解左右两边最大子序列和时必然会递归调用此函数,注意递归的结束条件。
def max3(x,y,z):#求三个数的最大值 max=x if y>max: max=y if z>max: max=z return max else: return max def findmaxsum(alist):#求最大子序列和 length=len(alist) if len(alist)<=1:#递归结束条件 return alist[0] mid=length//2 left_list=alist[:mid] rigth_list=alist[mid:] leftmaxsum=findmaxsum(left_list)#递归解决左边序列最大子序列和 rightmaxsum=findmaxsum(rigth_list)#递归解决右边最大子序列和 max_left_right_sum=leftmaxsum+rightmaxsum#跨界情况,进行求和 return max3(leftmaxsum,rightmaxsum,max_left_right_sum)#返回最大值
时间复杂度为O(nlogn),比暴力寻找的时间复杂度O(n^2)有所优化
动态规划求连续的最大子序列和
def test_func(num_list):#动态规划求最大连续子序列 length=len(num_list) max_value=-10000000 tmp=0 for i in range(length): tmp=max(tmp+num_list[i], num_list[i])#有效解决了连续问题 max_value=max(max_value, tmp) return max_value
时间复杂度为O(n),动态规划引用自点击打开链接