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类的多重继承问题深入分析
Nov 09 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
Python序列操作之进阶篇
Dec 08 Python
python实现学生管理系统
Jan 11 Python
python抓取文件夹的所有文件
Feb 27 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
python入门之井字棋小游戏
Mar 05 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
使用Python解决图表与画布的间距问题
Apr 11 Python
Elasticsearch 索引操作和增删改查
Apr 19 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中的(伪)多线程与多进程
2013/07/01 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
深入理解JavaScript中的并行处理
2016/09/22 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
js处理层级数据结构的方法小结
2017/01/17 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
python实现红包裂变算法
2016/02/16 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
Python中几种导入模块的方式总结
2017/04/27 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
创联软件面试题笔试题
2012/10/07 面试题
在职人员函授期间自我评价分享
2013/11/08 职场文书
教师节促销方案
2014/03/22 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
投标邀请书范本
2015/02/02 职场文书
教师节晚会主持词
2015/06/30 职场文书
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫