求最大子数组之和

Posted tansong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大子数组之和相关的知识,希望对你有一定的参考价值。

要求:

要求程序必须能处理1000个元素;

每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;

输入一个整形数组,数组里有整数也有负数;

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;

求所有子数组的和的最大值,要求时间复杂度为O(n)。

第一段处理1000个元素:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 using namespace std;
 5 int main()
 6 { 
 7     int n,star=0,end=0;         //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位
 8     cout<<"输入整型数组的长度:";
 9     cin>>n;
10     int *p=new int[n];
11     srand((unsigned)time(NULL));
12     for(int i=0;i<n;i++)
13     { 
14         p[i]=rand()%2000-1000; //随机取-1000~1000中的整数
15     }                          
16     for(int i=0;i<n;i++)
17     { 
18         cout<<p[i]<<"  ";      //输出这1000个元素
19         if((i+1)%10==0)        //每十个换行
20         {
21             cout<<endl;
22         }
23     }
24     int sum=p[0];              //子数组
25     int max_sum=p[0];          //最大子数组
26     for(int i=1;i<n;i++)
27     {   
28         if(sum>0)              //从第二个数开始判断是否为正数
29         { 
30             if(p[i]>(INT_MAX-sum))           //加入了一段判断int类型数据是否溢出。
31             {
32                 cout<<"int类型溢出"<<endl;
33                 return 0;
34             }
35             sum=sum+p[i];       //是正数,将和值(初始值为p【0】)和第i+1个数做和。
36             if(sum>max_sum)     // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
37             {
38                 max_sum=sum;
39                 end=i;
40             }
41         }
42         else 
43         { 
44             sum=p[i];          //是负数,将第i+1个数的值赋值给和值sum
45             if(sum>max_sum)    //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
46             {    
47                 max_sum=sum;
48                 star=i;
49                 end=i;
50             }
51         }
52     }
53     cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<""<<endl;
54     cout<<"最大子数组和为"<<max_sum<<endl;
55     return 0;
56 }

 

技术分享图片

技术分享图片

技术分享图片

第二段溢出情况:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 using namespace std;
 5 int main()
 6 { 
 7     int n,star=0,end=0;         //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位
 8     cout<<"输入整型数组的长度:";
 9     cin>>n;
10     int *p=new int[n];
11     srand((unsigned)time(NULL));
12     for(int i=0;i<n;i++)
13     { 
14         p[i]=rand()%2000-1000; //随机取-1000~1000中的整数
15         p[i]=p[i]*1000000;     //把随机数扩大10^6倍
16     }                          
17     for(int i=0;i<n;i++)
18     { 
19         cout<<p[i]<<"  ";      //输出这1000个元素
20         if((i+1)%10==0)        //每十个换行
21         {
22             cout<<endl;
23         }
24     }
25     int sum=p[0];              //子数组
26     int max_sum=p[0];          //最大子数组
27     for(int i=1;i<n;i++)
28     {   
29         if(sum>0)              //从第二个数开始判断是否为正数
30         { 
31             if(p[i]>(INT_MAX-sum))           //加入了一段判断int类型数据是否溢出。
32             {
33                 cout<<"int类型溢出"<<endl;
34                 return 0;
35             }
36             sum=sum+p[i];       //是正数,将和值(初始值为p【0】)和第i+1个数做和。
37             if(sum>max_sum)     // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
38             {
39                 max_sum=sum;
40                 end=i;
41             }
42         }
43         else 
44         { 
45             sum=p[i];          //是负数,将第i+1个数的值赋值给和值sum
46             if(sum>max_sum)    //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
47             {    
48                 max_sum=sum;
49                 star=i;
50                 end=i;
51             }
52         }
53     }
54     cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<""<<endl;
55     cout<<"最大子数组和为"<<max_sum<<endl;
56     return 0;
57 }

 

  技术分享图片

       结果只复制了结果,看到了提出int类型溢出。

总结:主要操作方法是借鉴别人的,然后两人一起在宿舍调试,最后出来结果。预计4个小时,实际上花了大概5个小时。

              技术分享图片

以上是关于求最大子数组之和的主要内容,如果未能解决你的问题,请参考以下文章

求最大子数组之和

求最大子数组之和

编程之美求数组的子数组之和的最大值

求数组的子数组之和的最大值及扩展问题2

求数组的子数组之和的最大值及扩展问题2

c_cpp 求数组的子数组之和的最大值