求最大子数组之和

要求:

要求程序必须能处理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 }

第二段溢出情况:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{ 
	int n,star=0,end=0;         //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位
    cout<<"输入整型数组的长度:";
    cin>>n;
    int *p=new int[n];
    srand((unsigned)time(NULL));
    for(int i=0;i<n;i++)     
    { 
		p[i]=rand()%2000-1000; //随机取-1000~1000中的整数
                p[i]=p[i]*1000000;     //把随机数扩大10^6倍
    }                          
    for(int i=0;i<n;i++)
    { 
        cout<<p[i]<<"  ";     //输出这1000个元素
        if((i+1)%10==0)        //每十个换行
        {
			cout<<endl;
        }
    }
    int sum=p[0];              //子数组
    int max_sum=p[0];          //最大子数组
    for(int i=1;i<n;i++)
    {   
        if(sum>0)              //从第二个数开始判断是否为正数
        { 
            if(p[i]>(INT_MAX-sum))           //加入了一段判断int类型数据是否溢出。
            {
                cout<<"int类型溢出"<<endl;
                return 0;
            }
            sum=sum+p[i];       //是正数,将和值(初始值为p【0】)和第i+1个数做和。
            if(sum>max_sum)     // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
            { 
				max_sum=sum;
                end=i;
            }
        }
        else 
        { 
			sum=p[i];          //是负数,将第i+1个数的值赋值给和值sum
            if(sum>max_sum)    //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
            {    
				max_sum=sum;
                star=i;
                end=i;
            }
        }
    }
	cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl;
    cout<<"最大子数组和为"<<max_sum<<endl;
    return 0;
}

  

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

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

              

原文地址:https://www.cnblogs.com/w123456qaz/p/9786863.html