最大子序列和算法
2015-09-14 14:49
246 查看
题目:求A[i]中和最大的子序列。
时间复杂度O(NlogN):
使用分治+递归的方法。分别求出左边N/2长度的最大子序列和、右边N/2长度的最打字序列和、以及横跨这两部分且通过中间的最大和(要分别求出两边带有最中间边界的最子大序列和,将其相加),由于不是最简单的方法,这里不再赘述。
时间复杂度O(N):
遍历一遍A即可得到结果:
个人分析:
算法中,thisSum每次重置,都代表前面的和为负,可不必考虑加在后面要计算的最大子序列中,即可重置thisSum,抛弃已计算过的值;重置后,只要thisSum不小于0,都可以考虑加在大子序列中,因此thisSum(s,...,e)范围包含的更小范围的子序列(s+i,...,e-j)中不会有超过已经计算过的最大值的子序列和。
时间复杂度O(NlogN):
使用分治+递归的方法。分别求出左边N/2长度的最大子序列和、右边N/2长度的最打字序列和、以及横跨这两部分且通过中间的最大和(要分别求出两边带有最中间边界的最子大序列和,将其相加),由于不是最简单的方法,这里不再赘述。
时间复杂度O(N):
遍历一遍A即可得到结果:
int MaxSubsequenceSum (Const int A[], int N) { int thisSu<span style="font-family: Arial, Helvetica, sans-serif;">m, MaxSum;</span> for(int i = 0; i < N; i ++) { thisSum += A[i]; if(thisSum > MaxSum) MaxSum = thisSum; else if(thisSum < 0) thisSum = 0; } return MaxSum; }
个人分析:
算法中,thisSum每次重置,都代表前面的和为负,可不必考虑加在后面要计算的最大子序列中,即可重置thisSum,抛弃已计算过的值;重置后,只要thisSum不小于0,都可以考虑加在大子序列中,因此thisSum(s,...,e)范围包含的更小范围的子序列(s+i,...,e-j)中不会有超过已经计算过的最大值的子序列和。
相关文章推荐
- HTML5/CSS3简易联系表单 扁平化风格
- Python默认编码错误SyntaxError: Non-ASCII character '\xe5'之解决方法
- maven 项目的依赖包下载
- iOS开发 -- 设置tableView的边框
- 我的openwrt学习笔记(三十):webserver之uhttpd
- 键盘闪现出来又消失的解决办法
- Nginx+fastDFS-nginx-module+FastDFS配置分布式文件系统
- 关键段(Critical Section)
- "undefined reference to" 问题解决方法
- Nginx+uWSGI+Django 好文
- This virtual machine is configured for 64-bit guest operating systems. However, 64-bit operation is
- 使用symbolicatecrash翻译crash log日志
- ield 'ClassID' doesn't have a default value 2015-09-14 13:37:25,015 ERROR [org.apache.struts2.dispatcher.Dispatcher] - Exception occurred during processing request: could not execute statement org.hibernate.exception.GenericJDBCException: could not execut
- org.aspectj.lang.JoinPoint解析
- LwIP网络接口结构体---netif
- swift 之url有中文参数
- 端口映射实例说明
- ubuntu下解决解压zip文件中文文件名乱码问题
- 操作系统典型调度算法简介
- java 多线程 ReentrantReadWriteLock 使用