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 相关文章推荐
Python程序设计入门(1)基本语法简介
Jun 13 Python
Python with的用法
Aug 22 Python
利用python修改json文件的value方法
Dec 31 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
基于django ManyToMany 使用的注意事项详解
Aug 09 Python
python实现飞机大战小游戏
Nov 08 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
python 如何对logging日志封装
Dec 02 Python
python lambda的使用详解
Feb 26 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 Python
python画条形图的具体代码
Apr 20 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
Python中设置变量访问权限的方法
2015/04/27 Python
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
python奇偶行分开存储实现代码
2018/03/19 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
新闻传媒系求职信范文
2014/04/19 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
银行自荐信怎么写
2015/03/05 职场文书
出国导师推荐信
2015/03/25 职场文书
大学生实习推荐信
2015/03/27 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android