python求最大连续子数组的和


Posted in Python onJuly 07, 2018

抛出问题:

求一数组如 l = [0, 1, 2, 3, -4, 5, -6],求该数组的最大连续子数组的和 如结果为[0,1,2,3,-4,5] 的和为7

问题分析:

这个问题很简单,直接暴力法,上代码。

# -*- coding:utf-8 -*-
# 日期:2018/6/9 7:46
# Author:小鼠标

# 最大连续子数组的和
l = [0, 1, 2, 3, -4, 5, -6]
# 暴力求解
def violence(l = []):
 maxVal = 0
 x,y=0,0
 for i in range(0,len(l)+1):
  for j in range(0,len(l)+1):
   res = sum(l[i:j])
   if res > maxVal:
    maxVal = res
    x = i
    y = j
 return maxVal,x,y
maxVal, x, y = violence(l)
print(maxVal,(x,y))

分治法:

关键是暴力法的时间复杂度太高,所以就在原有的基础上做了进一步的提升--分治法。

所谓分治法就是将原有的列表一分为二,那么最大的子列表只有三种情况:

1、最大子列表完全在左边

2、最大子列表完全在右边

3、最大子列表跨立在中间

所以我们分情况讨论,求出答案。这种方法一定程度的降低了时间复杂度,从之前的n^2降到了(n/2)^2 + 2n

# -*- coding:utf-8 -*-
# 日期:2018/6/9 7:46
# Author:小鼠标

# 最大连续子数组的和
l = [0, 1, 2, 3, -4, 5, -6]
#暴力求解
def violence(l = []):
 maxVal = 0
 x,y=0,0
 for i in range(0,len(l)+1):
  for j in range(0,len(l)+1):
   res = sum(l[i:j])
   if res > maxVal:
    maxVal = res
    x = i
    y = j
 return maxVal,x,y
#分治法 想左扫 向右扫,求出两边的最大值
def left_or_right(l):
 maxVal = 0
 term = 0
 for i in l:
  term += i
  if maxVal < term:
   maxVal = term
 return maxVal
def Separate():
 middle = int(len(l)/2)
 l1 = l[0:middle]
 l2 = l[middle:len(l)]
 #左半部分
 maxVal1,x1,y1 = violence(l1)
 #右半部分
 maxVal2,x2,y2 = violence(l2)
 #跨立在中间
 max_right = left_or_right(l2)
 max_left = left_or_right(l1[::-1])
 maxVal3 = max_right + max_left
 return max(maxVal1,maxVal2,maxVal3)
val = Separate()
print(val)

动态规划:

即便是分治法,时间复杂度还是太高,不满足生产的需求,所以如果说只求最大子序列的和的值而不去追求最大子序列本身,我们又引出一个方法--动态规划

这种方法的时间复杂是是线性的,极大的降低了。

# -*- coding:utf-8 -*-
# 日期:2018/6/9 8:38
# Author:小鼠标

def function(lists):
 max_sum = lists[0]
 pre_sum = 0
 for i in lists:
  # 因为最大子列表一定是从一个非0的数开始的(假定列表中有正数有负数)
  # 所以就可以暂时筛选调小于0的数,即便列表全是负数,那么最大的子列表肯定是负数最大的一个
  if pre_sum < 0:
   pre_sum = i
  else:
   pre_sum += i
  if pre_sum > max_sum:
   max_sum = pre_sum
 return max_sum
lists = [0, 1, 2, 3, -4, 5, -6]
print(function(lists))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python定时器使用示例分享
Feb 16 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
python并发2之使用asyncio处理并发
Dec 21 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
PyQT5 emit 和 connect的用法详解
Dec 13 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
python 平衡二叉树实现代码示例
Jul 07 #Python
详解python异步编程之asyncio(百万并发)
Jul 07 #Python
基于Python开发chrome插件的方法分析
Jul 07 #Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 #Python
Python实现的txt文件去重功能示例
Jul 07 #Python
Django 多语言教程的实现(i18n)
Jul 07 #Python
python利用requests库进行接口测试的方法详解
Jul 06 #Python
You might like
PHP中PDO的错误处理
2011/09/04 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
php命令行模式代码实例详解
2021/02/26 PHP
jQuery Tools tab使用介绍
2012/07/14 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
解决vue-loader加载不上的问题
2020/10/21 Javascript
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
雷蛇美国官网:Razer
2020/04/03 全球购物
.NET面试问题集
2015/12/08 面试题
关于保护环境的标语
2014/06/09 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
歌咏比赛主持词
2015/06/29 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
python_tkinter事件类型详情
2022/03/20 Python
angular异步验证器防抖实例详解
2022/03/31 Javascript
nginx lua 操作 mysql
2022/05/15 Servers