思路:
把一维环形数组从某一段切开,然后转化为之前做过的一维数组最大子数组的和的问题,
然后都其中切开的每一段一维数组做比较,输出最大的值。
1 #include<iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 int main() 6 { 7 int n; 8 cout<<"请输入一维环形数组的长度:"; 9 cin>>n; 10 int *p=new int[n];//定义数组 11 srand((unsigned)time(NULL)); 12 cout<<"随机获得一个数组:"<<endl; 13 for(int i=0;i<n;i++) 14 { 15 p[i]=rand()%200-100; //随机取-100~100中的整数 16 cout<<p[i]<<" "; 17 } 18 cout<<endl; 19 int t,m,*sum=new int[n],*max_sum=new int[n]; 20 //用sum数组储存子数组的和,用max_sum数组储存最大子数组的和 21 for(int i=0;i<n;i++) 22 { 23 sum[i]=p[0]; 24 max_sum[i]=p[0]; 25 for(int j=1;j<n;j++) 26 { 27 if(sum[i]>0)//从第二个数开始判断是否为正数 28 { 29 sum[i]=sum[i]+p[j]; //是正数,将和值(初始值为p[0])和第i+1个数做和。 30 if(sum[i]>max_sum[i])// 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 31 { 32 max_sum[i]=sum[i]; 33 } 34 } 35 else 36 { 37 sum[i]=p[j]; //是负数,将第i+1个数的值赋值给和值sum 38 if(sum[i]>max_sum[i]) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 39 { 40 max_sum[i]=sum[i]; 41 } 42 } 43 } 44 //环形数组转换成新的一维数组 45 m=p[0]; 46 p[0]=p[n-1]; 47 for(int k=0;k<n-1;k++) 48 { 49 t=m; 50 m=p[k+1]; 51 p[k+1]=t; 52 } 53 } 54 int max=max_sum[0];//max为max-sum数组的最大值 55 for(int i=1;i<n;i++) 56 { 57 if(max_sum[i]>max) 58 { 59 max=max_sum[i]; 60 } 61 } 62 cout<<"最大子数组的和为"<<max<<endl; 63 return 0; 64 }