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中的cookielib模拟登录网站
Apr 09 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
Python中title()方法的使用简介
May 20 Python
Python多线程和队列操作实例
Jun 21 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
分析python请求数据
Aug 19 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
Nov 02 Python
python中lower函数实现方法及用法讲解
Dec 23 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计划任务、定时执行任务的实现代码
2011/04/23 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
JS Timing
2007/04/21 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
js倒计时抢购实例
2015/12/20 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
python实现复制整个目录的方法
2015/05/12 Python
Python多进程fork()函数详解
2019/02/22 Python
python在不同条件下的输入与输出
2020/02/13 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
《猫》教学反思
2014/02/26 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
结婚主持人致辞
2015/07/28 职场文书
员工担保书范本
2015/09/22 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
Python软件包安装的三种常见方法
2022/07/07 Python