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基于列表list实现的CRUD操作功能示例
Jan 05 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
python对离散变量的one-hot编码方法
Jul 11 Python
python将秒数转化为时间格式的实例
Sep 16 Python
Python 变量类型详解
Oct 10 Python
python使用matplotlib绘制热图
Nov 07 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
对Django中内置的User模型实例详解
Aug 16 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
python如何对链表操作
Oct 10 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
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
百度留言本js 大家可以参考下
2009/10/13 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
Python中变量交换的例子
2014/08/25 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
计算机应用专业自荐信
2014/07/05 职场文书
校园广播稿100字
2014/10/06 职场文书
地球一小时活动总结
2015/02/27 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
python中的getter与setter你了解吗
2022/03/24 Python