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中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
python操作sqlite的CRUD实例分析
May 08 Python
python函数局部变量用法实例分析
Aug 04 Python
python 设置文件编码格式的实现方法
Dec 21 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
python输入多行字符串的方法总结
Jul 02 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Django中自定义查询对象的具体使用
Oct 13 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
详解KMP算法以及python如何实现
Sep 18 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 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文件上传类的分享
2017/07/06 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
初步讲解Python中的元组概念
2015/05/21 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
python可以用哪些数据库
2020/06/22 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
python实现网页录音效果
2020/10/26 Python
美国家具网站:Cymax
2016/09/17 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
村官学习十八大感想
2014/01/15 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
暑期社会实践感言
2014/02/25 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
2015年科室工作总结
2015/04/10 职场文书
好员工观后感
2015/06/17 职场文书
运动会加油稿50字
2015/07/21 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
初中历史教学反思
2016/02/19 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
python装饰器代码解析
2022/03/23 Python