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下的subprocess模块的入门指引
Apr 16 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python遍历pandas数据方法总结
Feb 09 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
Python turtle绘画象棋棋盘
Aug 21 Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 Python
python实现文法左递归的消除方法
May 22 Python
python爬虫selenium模块详解
Mar 30 Python
Python打包为exe详细教程
May 18 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
linux php mysql数据库备份实现代码
2009/03/10 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
vue实现记事本功能
2019/06/26 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python实现最长公共子序列
2018/05/22 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
python安装及变量名介绍详解
2020/12/12 Python
快餐公司创业计划书
2014/04/29 职场文书
法律专业自荐信
2014/06/03 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
离婚协议书范本及离婚须知
2014/10/15 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2014年科室工作总结
2014/11/20 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
golang elasticsearch Client的使用详解
2021/05/05 Golang
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python