用c++实现环形数组的最大子数组之和

思路:

  把一维环形数组从某一段切开,然后转化为之前做过的一维数组最大子数组的和的问题,

  然后都其中切开的每一段一维数组做比较,输出最大的值。

    

 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 }

    

 

posted @ 2018-11-03 16:20  王志杰123  阅读(339)  评论(0编辑  收藏  举报