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多线程抓取天涯帖子内容示例
Apr 03 Python
Python列表append和+的区别浅析
Feb 02 Python
python相似模块用例
Mar 04 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python实现定时任务
Feb 08 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
django Serializer序列化使用方法详解
Oct 16 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
python 模拟贷款卡号生成规则过程解析
Aug 30 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
python def 定义函数,调用函数方式
Jun 02 Python
python的help函数如何使用
Jun 11 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/06/02 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
Array.prototype 的泛型应用分析
2010/04/30 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
jsTree使用记录实例
2016/12/01 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
python logging模块的使用详解
2020/10/23 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
成人继续教育实施方案
2014/03/01 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
春节联欢会策划方案
2014/05/16 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
迎新晚会策划方案
2014/06/13 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
python解决12306登录验证码的实现
2021/04/18 Python