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

分析:

  1.将环形数组,剪开变成一个一维数组。

  2.用一维数组的最大子数组和解决。

对于一个环形数组,表示成一个一维数组总共有n种。如图所示:

程序代码:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n;
 6     cout<<"请输入一维数组的长度:";
 7     cin>>n;
 8     int *p=new int[n];//定义数组指针
 9     cout<<"请依次输入数组元素:"<<endl;
10     for(int i=0;i<n;i++)
11     {
12         cin>>p[i];
13     }
14     int t,m,*sum=new int[n],*max_sum=new int[n];
15     //*sum储存子数组的和,*max_sum储存最大子数组的和
16     for(int i=0;i<n;i++)
17     {
18         sum[i]=p[0];
19         max_sum[i]=p[0];
20         for(int j=1;j<n;j++)
21         {
22             if(sum[i]>0)//从第二个数开始判断是否为正数
23             { 
24                 sum[i]=sum[i]+p[j];  //是正数,将和值(初始值为p【0】)和第i+1个数做和。
25                 if(sum[i]>max_sum[i])// 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
26                 {
27                     max_sum[i]=sum[i];
28                 }
29             }
30             else 
31             { 
32                 sum[i]=p[j]; //是负数,将第i+1个数的值赋值给和值sum
33                 if(sum[i]>max_sum[i]) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
34                 {    
35                     max_sum[i]=sum[i];
36                 }
37             }
38         }
39         m=p[0];//环形数组转换成新的一维数组
40         p[0]=p[n-1];
41         for(int k=0;k<n-1;k++)
42         {
43             t=m;
44             m=p[k+1];
45             p[k+1]=t;
46         }
47     }
48     int max=max_sum[0];//max为所有最大子数组和的最大值
49     for(int i=1;i<n;i++)
50     {
51         if(max_sum[i]>max)//比较
52         {
53             max=max_sum[i];
54         }
55     }
56     cout<<"最大子数组的和为"<<max<<endl;//输出
57     return 0;
58 }

测试截图:

实验总结:对于环形数组只需将其化简成一维数组形式,再对其求最大子数组的和即可,完全等价于一维数组。将其化简成几小步去做就简单很多了。

猜你喜欢

转载自www.cnblogs.com/tansong/p/9901027.html
今日推荐