Python实现最大子序和的方法示例


Posted in Python onJuly 05, 2019

描述

给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。
例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4],
连续子序列 [4,-1,2,1] 的和最大,为 6。

我 v1.0

class Solution:
  def maxSubArray(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    l = len(nums)
    i = 0
    result = nums[0]
    while i < l:
      sums = []
      temp = 0
      for j in range(i, l):
        temp+=nums[j]
        sums.append(temp)
      if result < max(sums):
        result = max(sums)
      i+=1
    return result

测试结果如下:

Python实现最大子序和的方法示例 

本地运行时间为14.7s,说明我的方法太粗暴了。应该寻找更好的算法。

Python实现最大子序和的方法示例 

我 优化后v1.1。优化方案,去掉sums数组,节省空间。但时间复杂度仍然不变。

l = len(nums)
    i = 0
    result = nums[0]
    while i < l:
      temp = 0
      for j in range(i, l):
        temp+=nums[j]
        if result < temp:
          result = temp
      i+=1
    return result

仍然只通过200/202测试用例,仍然超出时间限制。但本地运行时间为8.3s。有进步。

别人,分治法。时间复杂度O(NlogN)

将输入的序列分成两部分,这个时候有三种情况。
1)最大子序列在左半部分
2)最大子序列在右半部分
3)最大子序列跨越左右部分。

前两种情况通过递归求解,第三种情况可以通过。

分治法代码大概如下,emmm。。。目前还没有完全理解。

def maxC2(ls,low,upp): 
  #"divide and conquer" 
  if ls is None: return 0 
  elif low==upp: return ls[low] 

  mid=(low+upp)/2 #notice: in the higher version python, “/” would get the real value 
  lmax,rmax,tmp,i=0,0,0,mid 
  while i>=low: 
    tmp+=ls[i] 
    if tmp>lmax: 
      lmax=tmp 
    i-=1 
  tmp=0 
  for k in range(mid+1,upp): 
    tmp+=ls[k] 
    if tmp>rmax: 
      rmax=tmp 
  return max3(rmax+lmax,maxC2(ls,low,mid),maxC2(ls,mid+1,upp)) 

def max3(x,y,z): 
  if x>=y and x>=z: 
    return x 
  return max3(y,z,x)

动态规划算法,时间复杂度为O(n)。
分析:寻找最优子结构。

l = len(nums)
    i = 0
    sum = 0
    MaxSum = nums[0]
    while i < l:
      sum+=nums[i]
      if sum > MaxSum:
          MaxSum = sum
      if sum < 0:
        sum = 0
      i+=1
    return MaxSum

Oh!My god!!! !!!!!!!!运行只花了0.2s!!!!!!!!!!!!!!!这也太强了吧!!

Python实现最大子序和的方法示例 

优化后,运行时间0.1s.

sum = 0
    MaxSum = nums[0]
    for i in range(len(nums)):
      sum += nums[i]
      if sum > MaxSum:
        MaxSum = sum
      if sum < 0:
        sum = 0
    return MaxSum

其中

sum += nums[i]必须紧挨。

MaxSum = sum

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
Django实现学生管理系统
Feb 26 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python实现根据文件格式分类
Oct 31 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
python 实现视频 图像帧提取
Dec 10 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
对tensorflow中cifar-10文档的Read操作详解
Feb 10 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
python如何调用java类
Jul 05 Python
Django缓存Cache使用详解
Nov 30 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 #Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 #Python
python使用opencv对图像mask处理的方法
Jul 05 #Python
Python代码太长换行的实现
Jul 05 #Python
Python PyCharm如何进行断点调试
Jul 05 #Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 #Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 #Python
You might like
浅谈php错误提示及查错方法
2015/07/14 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python两种遍历字典(dict)的方法比较
2014/05/29 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python装饰器简单用法实例小结
2018/12/03 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
python实现简单五子棋游戏
2019/06/18 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
寒假家长评语大全
2014/04/16 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
九年级英语教学反思
2016/02/15 职场文书
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL