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 相关文章推荐
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
Nov 18 Python
Python类的用法实例浅析
May 27 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
python3实现二叉树的遍历与递归算法解析(小结)
Jul 03 Python
python实现最小二乘法线性拟合
Jul 19 Python
微信公众号token验证失败解决方案
Jul 22 Python
django中使用POST方法获取POST数据
Aug 20 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
python图片指定区域替换img.paste函数的使用
Apr 09 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
基于python的matplotlib制作双Y轴图
Apr 20 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
将查询条件的input、select清空
2014/01/14 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
js图片预加载示例
2014/04/30 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
Python FTP操作类代码分享
2014/05/13 Python
Python中处理字符串之endswith()方法的使用简介
2015/05/18 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
报社实习生自荐信
2014/01/24 职场文书
五四青年节的活动方案
2014/08/20 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
化工见习报告范文
2014/10/31 职场文书
团代会开幕词
2015/01/28 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
实战Python爬虫爬取酷我音乐
2022/04/11 Python
css弧边选项卡的项目实践
2023/05/07 HTML / CSS