homework-01 "最大子数组之和"的解决过程

看到这个题目,我首先想到就是暴力解决

求出所有的子数组的和,取出最大值即可

但其中是可以有优化的

如 子数组【3:6】可以用【3:5】+【6】来计算

即可以将前面的计算结果保留下来,减少后面的重复计算

 

我是用C++实现的

代码如下

 1 #include <iostream>
 2 
 3 /*
 4 求出所有字串和,取最大值
 5 其中sun为用来存放结果的数组
 6 后面的字串和可由前面的字串和再加一个数得到
 7 可以减少运算次数
 8 */
 9 int maxSum0(int* a,int n){
10     int sum[10][10];
11     int max = 0;
12     for(int i=0; i<n; i++){
13         sum[0][i] = a[i];
14         std::cout<<a[i]<<" ";
15         if(max < a[i])
16             max = a[i];
17     }
18     std::cout<<std::endl;
19 
20     for(int i=1; i<n; i++){
21         for(int j=i;j<n;j++){
22             sum[i][j] = sum[i-1][j-1]+sum[0][j];
23             std::cout<<sum[i][j]<<" ";
24             if(max < sum[i][j])
25                 max = sum[i][j];
26         }
27         std::cout<<"\n";
28     }
29     return max;
30 }
31 
32 int main(){
33     int a[10]={2, -1, 7, 12, -8, 9, 6, -6, -2};
34     std::cout<<maxSum0(a,9)<<std::endl;
35     return 0;
36 }

 

测试结果

我把所有子数组和都打印出来了,结果是正确的

 

分析

我的算法时间复杂度应该是O(n^2),因为在做子数组求和运算过程中,每一个子数组求和都只需要做一次加法运算就可得到,子数组一共为n*(n+1)/2个

所以时间复杂度为O(n^2)

 

网上别人的好方法

这是我在http://blog.csdn.net/v_JULY_v/article/details/6444021上看到的

时间复杂度读仅为O(n)

 1 /*
 2 我看着这代码总觉的写的太简单了、、、
 3 可是测试结果都没错。。
 4 
 5 每一次累加到小于零的子串和时就从新开始
 6 */
 7 int maxSum1(int* a, int n){
 8     int max=0;  
 9     int b=0;
10     for(int i=0; i<n; i++)  
11     {
12         if(b<0)
13             b=a[i];
14         else  
15             b+=a[i];
16         if(max<b)  
17             max=b;  
18     }
19     return max;
20 }

这方法很不错,我就转过来了。

 

posted @ 2013-09-19 04:19  月月鸟在前进  阅读(333)  评论(1)    收藏  举报