抛出问题:

  求一数组如 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 最大连续子数组的和的更多相关文章

  1. python实现连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  2. 【剑指Offer】连续子数组的最大和 解题报告(Python)

    [剑指Offer]连续子数组的最大和 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  3. lintcode :continuous subarray sum 连续子数组之和

    题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...

  4. 剑指Offer(三十):连续子数组的最大和

    .# 剑指Offer(三十):连续子数组的最大和 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  5. 剑指Offer面试题:28.连续子数组的最大和

    一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...

  6. lintcode循环数组之连续子数组求和

    v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...

  7. 剑指Offer 连续子数组的最大和

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  8. 剑指offer面试题31连续子数组的最大和

    一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...

  9. 最大连续子数组问题2-homework-02

    1) 一维数组最大连续子数组 如第homework-01就是一维数组的最大子数组,而当其首位相接时,只需多考虑子数组穿过相接的那个数就行了! 2)二维数组 算法应该和第一次的相似,或者说是将二维转化为 ...

随机推荐

  1. 关于Java数据转存的中MultipartFile转File的问题(转)

    转自http://www.cnblogs.com/zuoxiaoxia/p/6116942.html 错误背景:由于文件储存在第三方的服务器上,所有需要讲将接收到MultipartFile文件 转换为 ...

  2. day08文件操作

    今日内容 文件操作 内容详细 1.打开文件 1.open("作业讲解.py",mode="r",encoding="utf-8") 2.文件 ...

  3. systemd的新特性及unit常见类型分析与awk用法示列

    简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理 系统引导的新特性 系统引导时实现服务启动: 按需激活进程: 系统状态快照: ...

  4. Android Studio删除依赖

    遇到报错 就是要删 ①在build.gradle中删除对应依赖代码(注释了,但是没用??) ②检查工程中的依赖 点击"file">>“project structure ...

  5. 【缓存】介绍和使用场景 MEMCACHE REDIS

    缓存缓存就是在内存中存储的数据备份,当数据没有发生本质改变的时候,我们就不让数据的查询去数据库进行操作,而去内存中取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度比去数据库查询要快一 ...

  6. python中的time模块和datetime模块

    >>> import time>>> time.time()1511330865.656656>>> time.localtime(time.ti ...

  7. 手机游戏引擎 Cocos

    Cocos是全球最受欢迎的移动游戏开发解决方案,整合了Cocos 2d-x.Cocos 2d-js.Cocos Studio.Cocos Code IDE等框架及工具,无论您是开发新手还是行业资深人士 ...

  8. Intel汇编指令格式解析

    环境: win7_x64旗舰版.VS2015企业版 一.Intel保护模式.实地址模式和虚拟8086模式指令格式(x86) 图在Intel手册2.1章节 1.1)Instruction Prefixe ...

  9. Linux下的常用文本编辑器

    Linux的文本编辑器 ed 在早期的unix平台上,ed可以说是唯一的编辑工具.它是一个很古老的行编辑器,vi这些编辑器都是从ed 演化而来.行编辑器使用起来很不方便,每次只能对一行进行操作,.而后 ...

  10. day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType

    一.ajax 的特点 1.异步交互:客户端发出一个请求后,需要等待服务器响应结束后, 才能发出第二个请求 2.局部刷新:给用户的感受是在不知不觉中完成请求和响应过程. 二.ajax 模板示例 ($.a ...