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

1.题目

要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.设计思想。

分别计算出所有子数组的和,进行比较,找出最大子数组。

3.代码。

#include<iostream>
#include<stdlib.h>
using namespace std;
#include <ctime>
#include <cstdlib>
#define MAX 100000
int main()
{
    int k,t=0,o=0;
    int n=0,m=0;
    int b[MAX];
    int a[MAX];
    cout<<"请输入数组中整数的个数:"<<endl;
    cin>>k;
    srand(time(0));
    for(int i=0;i<k;i++)
    {
        a[i]=rand()%100-50;
        cout<<a[i]<<" ";
    //    cin>>a[i];
    }
    
    for(int l=1;l<k+1;l++)
    {
        for(i=0;i<k-l+1;i++)
        {
            for(int j=i;j<i+l;j++)
            {
                if(j>k-1)
                {
                    break;
                }
                else
                    m=m+a[j];
            }
            b[n]=m;
            m=0;
            n=n+1;
        }
    }
    int max=b[0];
    for(i=1;i<n;i++)
    {
        if(max<b[i])
            max=b[i];
    }
/*    for(i=0;i<n;i++)
    {
        if(max==b[i])
        {
            m=i;
        }
    }
    m=m+1;
    int r=k;
    for(int j=0;j<k;j++)
    {
        if(m>=r&&r>=0)
        {
            m=m-r;
            t=t+1;
            r=r-1;
        }
        if(m==0&&r>0&&j!=k-1)
        {
            m=m+r+1;
            break;
        }
        if(m==0&&r==0&&t==k)
        {
            m=m+1;
            break;
        }
    }*/
    cout<<endl;
    cout<<"该数组中的最大子数组的和为:"<<max<<endl;
    /*cout<<"这些数字为:";
    m=m-1;
    if(t==0)
    {
        t=1;
    }
    for(i=m;i<m+t;i++)
    {
        cout<<a[i]<<"   ";
    }
    for(i=0;i<n;i++)
        cout<<b[i]<<" ";*/
    return 0;    
}

4.截图。

该图为查找1000个数中的最大子数组

数组中最大能存入10位数,超过10位数,系统就会自动舍弃后面的部分,而且,不会报错。

5.体会。

编程时一定要注意内存空间,不要超出最大内存,也不要超出数组的上限,这样会使系统出问题,但是程序不会报错。这样会使程序有很大的安全隐患。

6.照片。

 

原文地址:https://www.cnblogs.com/nulidexuezha/p/4378499.html