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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
Python中捕捉详细异常信息的代码示例
Sep 18 Python
python 自动化将markdown文件转成html文件的方法
Sep 23 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
详解flask表单提交的两种方式
Jul 21 Python
安装python及pycharm的教程图解
Oct 10 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
解决echarts中饼图标签重叠的问题
May 16 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
php笔记之:AOP的应用
2013/04/24 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
python密码错误三次锁定(实例讲解)
2017/11/14 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
python 提取文件指定列的方法示例
2019/08/07 Python
python Kmeans算法原理深入解析
2019/08/23 Python
Python 去除字符串中指定字符串
2020/03/05 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
python里glob模块知识点总结
2021/01/05 Python
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
小学毕业家长寄语
2014/01/19 职场文书
明信片寄语大全
2014/04/08 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
邀请函格式范文
2015/02/02 职场文书
改进工作作风心得体会
2016/01/23 职场文书