zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和

    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.照片。

     

  • 相关阅读:
    截图软件FastStone
    java中继承thread类的其他类的start()方法与run()方法
    .net连接MySql 出错
    题解【Codeforces1139C】Edgy Trees
    题解【Codeforces580C】Kefa and park
    题解【Codeforces1234D】Distinct Characters Queries
    题解【洛谷P4025】[PA2014]Bohater
    题解【洛谷P1445】[Violet]樱花
    题解【洛谷P2516】[HAOI2010]最长公共子序列
    题解【洛谷P3275】[SCOI2011]糖果
  • 原文地址:https://www.cnblogs.com/nulidexuezha/p/4378499.html
Copyright © 2011-2022 走看看