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实现的简单dns查询功能示例
May 24 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
python取余运算符知识点详解
Jun 27 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
Django全局启用登陆验证login_required的方法
Jun 02 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
Python还能这么玩之用Python修改了班花的开机密码
Jun 04 Python
python turtle绘图命令及案例
Nov 23 Python
python使用shell脚本创建kafka连接器
Apr 29 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
用libtemplate实现静态网页生成
2006/10/09 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
2018/08/19 PHP
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
js event事件的传递与冒泡处理
2009/12/06 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
js轮播图的插件化封装详解
2017/07/17 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
原生JS实现天气预报
2020/06/16 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
python装饰器代码深入讲解
2021/03/01 Python
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
高级销售求职信
2014/02/21 职场文书
2014年高考决心书
2014/03/11 职场文书
保护动物倡议书
2014/04/15 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
公司离职证明标准格式
2014/11/18 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS