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中常用的各种数据库操作模块和连接实例
May 29 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
python实现支持目录FTP上传下载文件的方法
Jun 03 Python
python 查找字符串是否存在实例详解
Jan 20 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
Python3爬虫学习入门教程
Dec 11 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
Nov 19 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
Python绘图实现显示中文
Dec 04 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 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+javascript液晶时钟
2006/10/09 PHP
php计算十二星座的函数代码
2012/08/21 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
vue 项目地址去掉 #的方法
2018/10/20 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
会计应届生的自荐信
2013/12/13 职场文书
公司合作意向书
2014/04/01 职场文书
计划生育证明书写要求
2014/09/17 职场文书
艺术节开幕词
2015/01/28 职场文书
贪污检举信范文
2015/03/02 职场文书
Python基础之进程详解
2021/05/21 Python
element tree树形组件回显数据问题解决
2022/08/14 Javascript