返回一个整数数组中最大子数组的和2

要求:

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

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

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

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

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

第一段处理1000个元素:

#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中的整数

    }                          

    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];       //是正数,将和值(初始值为p0】)和第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;

}

posted on 2019-01-10 10:17  数理小牛  阅读(115)  评论(0编辑  收藏  举报

导航