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 }
这方法很不错,我就转过来了。
浙公网安备 33010602011771号