这篇文章将为大家详细讲解有关怎么使用Python实现最大子序和,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
描述
给定一个序列(至少含有1个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。
引用>
例如,给定序列(2,1,3、4、1、2、1、5、4],
连续子序列[4、1、2、1]的和最大,为6 .我v1.0
class 解决方案: def 才能;maxSubArray(自我,,num): ,,,,,, ,,,:type num:,列表(int) ,,,:rtype: int ,,,,,, ,,,l =, len (num) ,,,小姐:=0 ,,,result =, num [0] ,,,while 小姐:& lt;,李: ,,,,,sums =, [] ,,,,,temp =0 ,,,,,for j 拷贝范围(我,,l): ,,,,,,,临时+=num [j] ,,,,,,,sums.append(临时) ,,,,,if result & lt;,马克斯(金额): ,,,,,,,result =,马克斯(金额) ,,,,,我+=1 ,,,return 结果测试结果如下:
,, l =, len (num) ,,,小姐:=0 ,,,result =, num [0] ,,,while 小姐:& lt;,李: ,,,,,temp =0 ,,,,,for j 拷贝范围(我,,l): ,,,,,,,临时+=num [j] ,,,,,,,if result & lt;,临时: ,,,,,,,,,result =temp ,,,,,我+=1 ,,,return 结果
仍然只通过200/202测试用例,仍然超出时间限制。但本地运行时间为8.3 s。有进步。
别人,分治法。时间复杂度O (NlogN)
将输入的序列分成两部分,这个时候有三种情况。
1)最大子序列在左半部分
2)最大子序列在右半部分
3)最大子序列跨越左右部分。
前两种情况通过递归求解,第三种情况可以通过。
分治法代码大概如下,emmm…目前还没有完全理解。
def maxC2 (ls,低,upp):, #才能“divide 以及conquer", if 才能;ls  is 没有:,return 0, elif 才能;低==upp:, return ls(低), 中期才能=(低+ upp)/2, #注意:,拷贝,higher version python,,“/? would get 从而real value tmp lmax,才能做,我=0,0,0,mid while 才能;i>=低:, ,,,tmp +=ls(我), ,,,if tmp> lmax:, ,,,,,lmax=tmp ,,,i -=1, tmp=0,才能 for 才能;k 拷贝范围(+ 1,中期upp):, ,,,tmp +=ls [k], ,,,if tmp>征求:, ,,,,,做=tmp return 才能;max3(征求+ lmax maxC2 (ls,低、中),maxC2 (ls,中期+ 1,upp)), def max3 (x, y, z):, if 才能;x>=y 以及x>=z:, ,,,return x return 才能;max3 (y, z、x)动态规划算法,时间复杂度为O (n)。
分析:寻找最优子结构。,,, l =, len (num) ,,,小姐:=0 ,,,sum =0 ,,,MaxSum =, num [0] ,,,while 小姐:& lt;,李: ,,,,,和+=num[我] ,,,,,if sum 祝辞,MaxSum: ,,,,,,,,,MaxSum =总和 ,,,,,if sum & lt;, 0: ,,,,,,,sum =0 ,,,,,我+=1 ,,,return MaxSum哦!我的上帝! ! ! ! ! ! ! ! ! ! !运行只花了0.2秒! ! ! ! ! ! ! ! ! ! ! ! ! ! !这也太强了吧! !
, sum =0 ,,,MaxSum =, num [0] ,,,for 小姐:拷贝范围(len (num)): ,,,,,sum +=, num[我] ,,,,,if sum 祝辞,MaxSum: ,,,,,,,MaxSum =总和 ,,,,,if sum & lt;, 0: null null
怎么使用Python实现最大子序和