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中使用 Selenium 实现网页截图实例
Jul 18 Python
在Python上基于Markov链生成伪随机文本的教程
Apr 17 Python
python中logging库的使用总结
Oct 18 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
Python批量修改图片分辨率的实例代码
Jul 04 Python
python处理大日志文件
Jul 23 Python
python多线程实现TCP服务端
Sep 03 Python
python时间日期操作方法实例小结
Feb 06 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
python如何爬取动态网站
Sep 09 Python
如何基于Python和Flask编写Prometheus监控
Nov 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
下载文件的点击数回填
2006/10/09 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
用cssText批量修改样式
2009/08/29 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
Node.js实现文件上传的示例
2017/06/28 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
详解JavaScript中的强制类型转换
2019/04/15 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
python万年历实现代码 含运行结果
2017/05/20 Python
TensorFlow变量管理详解
2018/03/10 Python
python cs架构实现简单文件传输
2020/03/20 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
对Python信号处理模块signal详解
2019/01/09 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python 使用多属性来进行排序
2019/09/01 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
一些PHP的面试题
2015/05/06 面试题
税务专业毕业生自荐信
2013/11/10 职场文书
火车来了教学反思
2014/02/11 职场文书
婚前财产协议书范本
2014/10/19 职场文书
加班费申请报告
2015/05/15 职场文书
人民调解协议书
2016/03/21 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL