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类方法与对象方法
Mar 15 Python
图文详解WinPE下安装Python
May 17 Python
Python 中Pickle库的使用详解
Feb 24 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
Python sorted函数详解(高级篇)
Sep 18 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
python 用pandas实现数据透视表功能
Dec 21 Python
Python实现的扫码工具居然这么好用!
Jun 07 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错误日志的获取方法
2015/07/20 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
Python实现获取网站PR及百度权重
2015/01/21 Python
python rsa 加密解密
2017/03/20 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Numpy之random函数使用学习
2019/01/29 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
Python map及filter函数使用方法解析
2020/08/06 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
医学生自我评价
2014/01/27 职场文书
《雷雨》教学反思
2014/02/20 职场文书
社区义诊活动总结
2014/04/30 职场文书
老公婚前保证书
2015/02/28 职场文书
工作收入证明范本
2015/06/12 职场文书
2016年寒假生活小结
2015/10/10 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS