最大子序列问题
2016-03-20 12:46
330 查看
问题定义:对于一包含n个浮点数的向量,求其连续序列的最大值
解法一:枚举法是一种显而易见的做法,其时间复杂度为O(n*n*n)
这段代发简洁明了,但时间复杂度为立方,运行速度太慢
解法二:在解法一的基础上对其进行优化,总和sum可以由第二循环得出,不需要再嵌套一个循环来计算总和。保存状态避免重复计算。这样使时间复杂度降到了平方。
另外一种类似的算法是对信息进行预处理。数组cumarr的第i个元素为x[0…i]的累加和,所以x[i…j]中各个数的总和可以通过计算cumarr[i]-cumarr[i-1]得到。起事件复杂度也为平法。
解法三:分治法。要解决规模为n的问题,可递归地解决两个规模近似为n/2的子问题,然后对它们的答案进行合并以得到整个问题的答案。
解法四:扫描算法
解法一:枚举法是一种显而易见的做法,其时间复杂度为O(n*n*n)
int MaxSubsequence(int n,int x[]) { // insert code here... int maxsofar = 0; int i = 0; int j = 0; int k = 0; for (i = 0; i < n; i++) { for (j = i; j < n; j++) { int sum = 0; for (k = i; k < j+1; k++) { sum += x[k]; maxsofar = max(maxsofar,sum); } } } return maxsofar; }
这段代发简洁明了,但时间复杂度为立方,运行速度太慢
解法二:在解法一的基础上对其进行优化,总和sum可以由第二循环得出,不需要再嵌套一个循环来计算总和。保存状态避免重复计算。这样使时间复杂度降到了平方。
int MaxSubsequence(int n,int x[]) { // insert code here... int maxsofar = 0; int i = 0; int j = 0; for (i = 0; i < n; i++) { int sum = 0; for (j = i; j < n; j++) { sum += x[j]; maxsofar = max(maxsofar, sum); } } return maxsofar; }
另外一种类似的算法是对信息进行预处理。数组cumarr的第i个元素为x[0…i]的累加和,所以x[i…j]中各个数的总和可以通过计算cumarr[i]-cumarr[i-1]得到。起事件复杂度也为平法。
int MaxSubsequence(int n,int x[]) { // insert code here... int maxsofar = 0; int i = 0; int j = 0; int sum = 0; int cumarr[] = {0,0,0,0,0,0,0}; for (i = 0; i < n; i++) { cumarr[i] = cumarr[i-1] + x[i]; } maxsofar = 0; for (i = 0; i < n; i++) { for (j = i; j < n; j++) { sum = cumarr[j] - cumarr[i-1]; maxsofar = max(maxsofar,sum); } } return maxsofar; }
解法三:分治法。要解决规模为n的问题,可递归地解决两个规模近似为n/2的子问题,然后对它们的答案进行合并以得到整个问题的答案。
int MaxSubsequence(int l,int r,int x[]) { // insert code here... int lmax = 0; int rmax = 0; int m = 0; int sum = 0; if (l > r) { return 0; } if (l == r) { return max(0, x[l]); } m = (l + r) / 2; int i = 0; for (i = m ;i >= 1; i--) { sum += x[i]; lmax = max(lmax, sum); } sum = 0; for (i = m + 1; i <= r; i++) { sum += x[i]; rmax = max(rmax, sum); } return max3(lmax + rmax, MaxSubsequence(l,m,x),MaxSubsequence(m+1,r,x)); }
解法四:扫描算法
int MaxSubsequence(int n,int x[]) { int maxsofar = 0; int maxendinghere = 0; for( int i =0;i < n ;i++) { maxendinghere = max(maxendinghere + x[i], 0); maxsofar = max(maxsofar,maxendinghere); } return maxsofar; }
相关文章推荐
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
- 解决HTML外部引用CSS文件不生效问题
- hibernate和spring整合时出现的数据库连接问题
- 解决HTML外部引用CSS文件不生效问题
- C语言第三篇:C语言数据类型及各数据类型所占内存字节数
- BP反向传播算法是如何工作的How the backpropagation algorithm works
- 多线程“基础篇”08之 join()
- UVA 10870 Recurrences(构造矩阵和快速幂)
- leetcode 61. Rotate List
- Tomcat集群配置
- MySQL 01 通过二进制包安装MySQL
- 第三周项目1:求最大公约数
- 图的割点 邻接表和邻接矩阵的分析
- ASP.NET5 MVC6 连接SQLSERVER
- STS: Spring Boot and Hibernate
- 关键字void
- 每日一算法---寻找丑数
- React Native iOS环境搭建
- IOS Animation-贝塞尔曲线与Layer简单篇(一)
- hdu3608最长回文子串