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发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
python分割和拼接字符串
Nov 01 Python
python在linux中输出带颜色的文字的方法
Jun 19 Python
Python Tkinter GUI编程入门介绍
Mar 10 Python
深入浅析Python的类
Jun 22 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
Feb 07 Python
python软件都是免费的吗
Jun 18 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
Python 随机按键模拟2小时
Dec 30 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 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/20 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
JavaScript 乱码问题
2009/08/06 Javascript
javascript 类定义的4种方法
2009/09/12 Javascript
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python脚本实现集群检测和管理功能
2015/03/06 Python
深入解析Python中的WSGI接口
2015/05/11 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
一行python实现树形结构的方法
2019/08/09 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
应届大学生的推荐信
2013/11/20 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
上课不认真检讨书
2014/09/17 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript