题目:返回一个一维循环数组中最大子数组的和

方法一:
#include <iostream> #include <ctime> #define N 10 using namespace std; int maxxunhuan(int array[N] , int n){ int i,j = 0,m,c = 0; int sum = array[0],b = 0,max = 0; for(j = 0;j < n;j++){ b = 0; for(i = j;i < n;i++){ if(i < n-1){ if(b > 0){ b += array[i]; m = i; } else b = array[i]; if(b > sum) sum = b; } if(i == n-1){ b = b + array[i]; for(c = 0;c < j;c++){ if(b > 0) b += array[c]; else b = array[c]; if(b > sum) sum = b; } } } if(sum >max) max = sum; } return sum; } int main(){ int array[N]; int i; memset(array,0,sizeof(array)); //初始化一维数组 cout<<"随机生成的一维数组为的:"<<endl; srand((unsigned)time(0)); for(i = 0;i < N;i++){ array[i] = rand()%25-10; cout<<array[i]<<'\t'; } cout<<"最大循环子数组为:"<<endl; cout<<maxxunhuan(array , N); return 0; }

 

 

 

编程思想:

用srand随机生成一维数组。

如:1 , 14 ,  -9 ,  -1 , 6 , 6, -2, 3, -9,  4

第一次循环是从1 , 14 ,  -9 ,  -1 , 6 , 6, -2, 3, -9,  4

第二次循环是从14 ,  -9 ,  -1 , 6 , 6, -2, 3, -9,  4, 1

第三次循环是从-9 ,  -1 , 6 , 6, -2, 3, -9,  4, 1,   14

。。。。

第n次循环是从。。。

用变量j来控制循环的次数,有n个数就有n个循环。

在每次循环中,参考返回一维数组最大子数组的方法,求出每一次循环中的最大子数组sum,然后用max来表示总循环中最大的那个子数组

 

时间复杂度o(n2).

 

 

方法二:

#include <iostream>
#include <ctime>
#define N 10
using namespace std;

int maxxunhuan(int array[2*N] , int n){
   int i,j,m = 0,c = 0;
   int sum = array[0],b= 0,max = 0;
   for(j = 0;j < n;j++)
       array[n+j] = array[j];
   for(j = 0;j < n;j++){
       b = 0;
       sum = 0;
       for(i = j;i < 2*n;i++){
           if(b > 0)
               b += array[i];
           else{
               b = array[i];
               c = i;
           }
           if(b > sum ){
               m = i;
               if(m > c+n-1) break;
               else  sum = b;
           }
       }   
       if(sum > max)
           max = sum;
    }
   return max;
 }

int main(){
   int array[2*N];
   int i;
   memset(array,0,sizeof(array));                       //初始化一维数组
   cout<<"随机生成的一维数组为的:"<<endl;
   srand((unsigned)time(0));
   for(i = 0;i < N;i++){
       array[i] = rand()%25-10;
       cout<<array[i]<<'\t';
   }
   cout<<"最大循环子数组为:"<<endl;
   cout<<maxxunhuan(array , N);
   return 0;
}

 

方法二:

上课的时候听了我同学的一个方法课下进行了改进。在于把数组复制变成一个长度为原来二倍的数组,然后按照一维数组求最大子数组的方法求解。需要注意的是要保证子数组的长度应小于等于n。

同时还应该注意的是这里的时间复杂度还是o(n2).如果只照搬按照一维数组求解的方法我们可以求出长度小于等于n的一个子数组,但是可能却并不是最大。

比如  1   -1     1    2     12    8    -8     10    0     10

复制之后为  1   -1     1    2     12    8    -8     10    0     10    1   -1     1    2     12    8    -8     10    0     10

最大的为从10   0  10   1   -1   1   2   12   8      最大值应为43

可是如果只按照照搬按照一维数组求解的方法求解的结果为1   -1     1    2     12    8    -8     10    0     10,值为35

明显的不对的,原因在于数组长度限制在n,而他又是从a[0]开始加且加的过程中由满足一维数组求最大子数组的条件求出来的知识a[0]---a[9]的最大子数组,并非a[0]---a[19]的最大子数组。所以还要另外设一个变量j循环

第一次是从1   -1     1    2     12    8    -8     10    0     10

第二次是从-1     1    2     12    8    -8     10    0     10    1

第三次是从1    2     12    8    -8     10    0     10   1     -1

。。。。。

求出a[0]---a[19]的最大字数字

posted @ 2015-04-15 22:54  老张哈哈哈  阅读(315)  评论(1编辑  收藏  举报