题目:

给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。

例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4]
连续子序列 [4,-1,2,1] 的和最大,为 6

思路1:贪心法【时间复杂度为O(n2)】

设置两个最大标记:subSum = max( 当前值,之前的序列+当前值 )

                           maxSum = max( 当前最大和,subSum 【更新的和】)

def maxSub (A):if not A:return 0else:subSum=maxSum=A[0]for item in A[1:]:subSum=max(item,item+subSum)maxSum=max(subSum,maxSum)return maxSum

思路2:分治法【时间复杂度为O(nlogn)】

分:左、中、右

治:左【不处理】、右【不处理】、中【中间数往左遍历相加和取最大,中间数往右遍历相加和取最大,再加总左右两边】

并:比较左、中、右大小,取最大。

比如:nums=[-2,1,-3,4,-1,2,1,-5,4]

  一:左:【-2,1,-3,4,-1】右:【2,1,-5,4】,中间数为-1,故【中】从-1开始往左往右遍历相加和

  二:先递归左【-2,1,-3,4,-1】,左:【-2,1,-3】,右:【4,-1】,中:-3

  三:再递归左【-2,1,-3】,左:【-2,1】,右:【-3】,中:1

  四:再递归左【-2,1】,左【-2】,右:【1】,中:-2

     由于左【-2<0】,return 0,

       右【1>0】 return 1(右的值)。

       中:-2向左遍历和为-2,向右遍历(不含中-2)和为1,两者相加为-1,return -1

       比较左、中、右大小,最大为右,故【-2,1】return 1【右值】

  五:(返回到第三)  左【-2,1】返回值为1

           右【-3】返回值为-3

           中:1往左遍历和最大为1,往右为-3,故两者相加为-2

          比较左、中、右,故【-2,1,-3】return 1

  六:(返回二)左:【-2,1,-3】return 1,右【4,-1】return 4。中【-3】,往左遍历,最大应该是-3+1=-2,往右遍历:4,return  -2+4=2。比较大小,【-2,1,-3,4,-1】return 4。

  七:(返回一)左【-2,1,-3,4,-1】return 4,右【2,1,-5,4】return 4。中【-1】,左遍历为3,右遍历为3,return 3+3=6。比较大小(4,4,6)return 6。

def MaxSubArray(nums,l,r):if r-l==1:if nums[l]>0:return nums[l]else:return 0mid=(l+r)//2maxSum=0#左maxLeftSum=MaxSubArray(nums,l,mid)   #右maxRightSum=MaxSubArray(nums,mid,r)#中MLA=0MRA=0maxMLA=0maxMRA=0#中往左遍历i=midwhile i>=l:MLA+=nums[i]if MLA>maxMLA:maxMLA=MLAi-=1#中往右遍历j=mid+1while j<r:MRA+=nums[j]if MRA>maxMRA:maxMRA=MRAj+=1#比较左中右大小return max(maxLeftSum,maxRightSum,maxMLA+maxMRA)

转载于:https://www.cnblogs.com/Lee-yl/p/8858508.html

算法3-------最长子序列和相关推荐

  1. C语言实现最长子序列 longest subsequence 算法(附完整源码)

    最长子序列 longest subsequence 算法 C语言最长子序列 longest subsequence 算法完整源码(定义,实现,main函数测试) C语言最长子序列 longest su ...

  2. 【算法】【递归与动态规划模块】两个字符串的公共最长子序列

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  3. 单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列

    最长公共子序列 的 算法思路 在这里 点击进入  将 代码稍微改动一下 就可以   ,   最长公共子序列  是两个 字符串求 公共子序列  , 可以将其中的 一个 改为 从 a 到 z  这样输入另 ...

  4. 最长子序列(LCS, LIS, LCIS)

    (一)最长公共子序列(LCS): 我们用Xi代表{x1, x2, .. , xi}, 用Yj代表{y1, y2, .. , yj}.那么,求长度分别为n,m的两个序列X, Y的LCS,就相当于求Xm与 ...

  5. 动态规划----最长子序列

    引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7-.an,求它的一个子序列(设为s1,s2,-sn),使得这个子序列满足这样的性质,s1<s2<s3<-< ...

  6. 一道有趣的最长子序列问题

    一道有趣的最长子序列问题 – 潘登同学的金融经济学笔记 文章目录 一道有趣的最长子序列问题 -- 潘登同学的金融经济学笔记 来源 求解 递推公式 算法实现 来源 前几天在刷视频的时候,发现了这样一道题 ...

  7. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1< ...

  8. 苦恼的月下老人(最长子序列)by C++

    苦恼的月下老人(最长子序列)by C++ 题目要求(题目来源:xmu oj) 题目分析 代码截图: 题目要求(题目来源:xmu oj) 描述 传说中,月老是掌管男女婚姻之神.每年七夕,七星娘娘会把人世 ...

  9. 单调递增最长子序列(动态规划)

    7-1 单调递增最长子序列 (20分) 设计一个 O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列. 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字 ...

  10. 动态规划之-----单调递增最长子序列(nyoj17)

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行 ...

最新文章

  1. 近亿台物联网设备或遭劫持,这家IoT云平台遭遇“灾难性”入侵事件
  2. 华中科技大学计算机考研408,【21计算机考研】华中科技大学不改408了?燕山大学官宣408!...
  3. python读音有道词典-有道词典命令行快速翻译,Python编程的利器
  4. 1.3 字符编码介绍
  5. 数字图像处理技术详解程序_安装地暖施工程序有哪些 安装地暖技术要求是什么【详解】...
  6. 【Java】浅谈关键词transient的使用
  7. Linux硬盘检测命令smartctl
  8. java中的类如何选取,java里如何获取泛型的类型
  9. 【2020模拟考试T4】【PAT乙】1034 有理数四则运算 (20分) 测试点2
  10. python3使用requests和requests_toolbelt上传文件
  11. 《深入浅出通信原理》读书笔记系列1-第2章 信号与频谱
  12. wps页码从指定页开始_wps怎么自动生成页码以及设置页码从第三页开始
  13. 整人网页html语言网站,html愚人节整人一直弹的网页窗口怎么做?
  14. OpenCV之模板匹配
  15. oracle select into from 用法,sql select into用法
  16. 微信生态圈盈利模式分析
  17. 电子签名屏什么牌子好
  18. Ubuntu下pyglet无法解码MP3
  19. 模块“XXX.dll”加载失败
  20. 蛊惑者马云发家史(曾推毛氏运动唐僧团队)一

热门文章

  1. 面试题06. 从尾到头打印链表
  2. osquery的认识
  3. shell遍历文件夹
  4. C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)
  5. QT三种窗口、调试终端信息打印、新建菜单、设置窗口标题名称、界面初始化、打开文件对话框、保存文件对话框
  6. Python 用pygame模块播放MP3
  7. FunDA(7)- Reactive Streams to fs2 Pull Streams
  8. 【转】oracle数据库NUMBER数据类型
  9. 【SGU】SGU每日练1·Little shop of flowers【DP】
  10. 自定义JPA之AttributeConverter