怎么使用Python实现最大子序和

  介绍

这篇文章将为大家详细讲解有关怎么使用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 结果

测试结果如下:

怎么使用Python实现最大子序和”>,<br/> </p> <p>本地运行时间为14.7秒,说明我的方法太粗暴了。应该寻找更好的算法。<br/> </p> <p> <img src=,, 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秒! ! ! ! ! ! ! ! ! ! ! ! ! ! !这也太强了吧! !

怎么使用Python实现最大子序和”>,<br/> </p> <p>优化后,运行时间0.1 s。</p> <pre class=, sum =0   ,,,MaxSum =, num [0]   ,,,for 小姐:拷贝范围(len (num)):   ,,,,,sum  +=, num[我]   ,,,,,if  sum 祝辞,MaxSum:   ,,,,,,,MaxSum =总和   ,,,,,if  sum  & lt;, 0:   null   null

怎么使用Python实现最大子序和