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通过pil为png图片填充上背景颜色的方法
Mar 17 Python
初步讲解Python中的元组概念
May 21 Python
Python简明入门教程
Aug 04 Python
使用python3.5仿微软记事本notepad
Jun 15 Python
python机器学习之神经网络(二)
Dec 20 Python
python的常用模块之collections模块详解
Dec 06 Python
Python Pandas数据中对时间的操作
Jul 30 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
python生成特定分布数的实例
Dec 05 Python
keras.utils.to_categorical和one hot格式解析
Jul 02 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Selenium浏览器自动化如何上传文件
Apr 06 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
第一个无线电台是由谁发明的
2021/03/01 无线电
收集的DedeCMS一些使用经验
2007/03/17 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
AngularJs基本特性解析(一)
2016/07/21 Javascript
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
python实现根据图标提取分类应用程序实例
2014/09/28 Python
Python中单、双下划线的区别总结
2017/12/01 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
用python实现刷点击率的示例代码
2019/02/21 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
python 实现绘制整齐的表格
2019/11/18 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
Delphi工程师笔试题
2013/09/21 面试题
网络教育自我鉴定
2013/11/01 职场文书
营销专业应届生求职信
2013/11/26 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
产品售后服务承诺书
2014/05/21 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android