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使用bs4获取58同城城市分类的方法
Jul 08 Python
python实现NB-IoT模块远程控制
Jun 20 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
使用python代码进行身份证号校验的实现示例
Nov 21 Python
python实现坦克大战
Apr 24 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 25 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 图像处理类1
2009/06/15 PHP
php数据访问之增删改查操作
2016/05/09 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
JS代码优化的8点建议
2020/02/04 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
python去掉字符串中重复字符的方法
2014/02/27 Python
全面解读Python Web开发框架Django
2014/06/30 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
python 实现视频 图像帧提取
2019/12/10 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
西班牙手机之家:Phone House
2018/10/18 全球购物
电大毕业个人生自我鉴定
2014/03/26 职场文书
社区护士演讲稿
2014/08/27 职场文书
无房证明范本
2014/09/17 职场文书
答谢词范文
2015/01/05 职场文书
学生逃课检讨书
2015/02/17 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
python文件目录操作之os模块
2021/05/08 Python
Python使用Web框架Flask开发项目
2022/06/01 Python