算法3-------最长子序列和
题目:
给定一个序列(至少含有 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-------最长子序列和相关推荐
- C语言实现最长子序列 longest subsequence 算法(附完整源码)
最长子序列 longest subsequence 算法 C语言最长子序列 longest subsequence 算法完整源码(定义,实现,main函数测试) C语言最长子序列 longest su ...
- 【算法】【递归与动态规划模块】两个字符串的公共最长子序列
目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...
- 单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列
最长公共子序列 的 算法思路 在这里 点击进入 将 代码稍微改动一下 就可以 , 最长公共子序列 是两个 字符串求 公共子序列 , 可以将其中的 一个 改为 从 a 到 z 这样输入另 ...
- 最长子序列(LCS, LIS, LCIS)
(一)最长公共子序列(LCS): 我们用Xi代表{x1, x2, .. , xi}, 用Yj代表{y1, y2, .. , yj}.那么,求长度分别为n,m的两个序列X, Y的LCS,就相当于求Xm与 ...
- 动态规划----最长子序列
引出: 问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7-.an,求它的一个子序列(设为s1,s2,-sn),使得这个子序列满足这样的性质,s1<s2<s3<-< ...
- 一道有趣的最长子序列问题
一道有趣的最长子序列问题 – 潘登同学的金融经济学笔记 文章目录 一道有趣的最长子序列问题 -- 潘登同学的金融经济学笔记 来源 求解 递推公式 算法实现 来源 前几天在刷视频的时候,发现了这样一道题 ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1< ...
- 苦恼的月下老人(最长子序列)by C++
苦恼的月下老人(最长子序列)by C++ 题目要求(题目来源:xmu oj) 题目分析 代码截图: 题目要求(题目来源:xmu oj) 描述 传说中,月老是掌管男女婚姻之神.每年七夕,七星娘娘会把人世 ...
- 单调递增最长子序列(动态规划)
7-1 单调递增最长子序列 (20分) 设计一个 O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列. 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字 ...
- 动态规划之-----单调递增最长子序列(nyoj17)
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行 ...
最新文章
- 近亿台物联网设备或遭劫持,这家IoT云平台遭遇“灾难性”入侵事件
- 华中科技大学计算机考研408,【21计算机考研】华中科技大学不改408了?燕山大学官宣408!...
- python读音有道词典-有道词典命令行快速翻译,Python编程的利器
- 1.3 字符编码介绍
- 数字图像处理技术详解程序_安装地暖施工程序有哪些 安装地暖技术要求是什么【详解】...
- 【Java】浅谈关键词transient的使用
- Linux硬盘检测命令smartctl
- java中的类如何选取,java里如何获取泛型的类型
- 【2020模拟考试T4】【PAT乙】1034 有理数四则运算 (20分) 测试点2
- python3使用requests和requests_toolbelt上传文件
- 《深入浅出通信原理》读书笔记系列1-第2章 信号与频谱
- wps页码从指定页开始_wps怎么自动生成页码以及设置页码从第三页开始
- 整人网页html语言网站,html愚人节整人一直弹的网页窗口怎么做?
- OpenCV之模板匹配
- oracle select into from 用法,sql select into用法
- 微信生态圈盈利模式分析
- 电子签名屏什么牌子好
- Ubuntu下pyglet无法解码MP3
- 模块“XXX.dll”加载失败
- 蛊惑者马云发家史(曾推毛氏运动唐僧团队)一
热门文章
- 面试题06. 从尾到头打印链表
- osquery的认识
- shell遍历文件夹
- C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)
- QT三种窗口、调试终端信息打印、新建菜单、设置窗口标题名称、界面初始化、打开文件对话框、保存文件对话框
- Python 用pygame模块播放MP3
- FunDA(7)- Reactive Streams to fs2 Pull Streams
- 【转】oracle数据库NUMBER数据类型
- 【SGU】SGU每日练1·Little shop of flowers【DP】
- 自定义JPA之AttributeConverter