zoukankan      html  css  js  c++  java
  • 求一个整型数组的最大子数组的和 真真

    团队成员:迟真真 冯小兰

    求一个整型数组的最大子数组的和

    看到这个题目,是这样想的:

    子数组的元素个数为1个,2个,3个、、、、、n个

    #include<stdio.h>
    #define M 100
    void main()
    { 
        int a[M];
        int i,j,N;
        int m=0,max=0;
        int n;
        printf("输入数组个数  ");
        scanf("%d",&n);
        N=n-1;
        printf("输入数组元素  ");
        for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    
        for(i=0;i<n;i++)    //比较一个元素时的最大值
        {
            if(a[i]>max)
            
            {
                max=a[i];
            }
        }
    
        while(N>0)     //比较相邻2,3。。n个相邻元素时的最大值
        {
           for(i=0;i<N;i++)
           { 
               m=0;
               for(j=0;j<=(n-N);j++)  //计算相邻的(n-N+1)的和,赋给m
               {
                   m=m+a[i+j];
               }
               if(m>max)
               {
                max=m;
               }
             }
           N--;   
        }
        printf("最大为:%d",max);
    
      
    }

    后来又想了一种这样的方法,如下:

    a[0]

    a[0]+a[1]

    a[0]+a[1]+a[2]

    ……

    a[0]+a[1]+a[2]+……a[n-1]

         a[1]

         a[1]+a[2]

         a[1]+a[2]+a[3]

         ………

         a[1]+ a[2]+a[3]+……..a[n-1]

              a[2]

              a[2]+a[3]

              a[2]+a[3]+a[4]

              ………..

              a[2]+a[3]+a[4]+……a[n-1]

          ………..

    以此类推:

                              a[i]

                              a[i]+a[i+1]

                             …….

                              a[i]+a[i+1]………a[n-i]

    因此可以找到规律,然后用3个for循环语句。

    #include<stdio.h>
    void main()
    {
        int a[100];
        int i,j,n;
        int k;
        int m=0,max;
        printf("请输入数组元素的个数:");
        scanf("%d",&n);
        printf("请输入数组元素:");
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
    
        max=a[0];
        for(i=0;i<n;i++)
        {    
            
            for(j=i;j<n;j++)
            {
                m=0;
                for(k=i;k<=j;k++)
                {
                    m=m+a[k];
                }
                if(m>max)
                {
                    max=m;
                }
            }
        }
        printf("最大子数组的和为:%d\n",max);
    
    
    }

    但是考虑到时间空间复杂度,这种方法貌似不太好

    可以先比较出和的最大值,把这些和的最大值放在一个数组中,然后再求这个数组的最大值。

    运行结果:

    下面是分析的过程草稿:

    欢迎指正!

  • 相关阅读:
    random、shutil、shevle、标准输入输出错误流
    Python中Json 和 pickle 详解
    Python 中的sys、os、os.path模块总结
    Python 中time,calendar,datatime模块总结
    包的概念和导入包的方法
    Python 中模块及其导入方式
    迭代器和生成器
    python 函数参数
    JAVA 配置Path环境变量
    腾讯云服务器简单配置web项目
  • 原文地址:https://www.cnblogs.com/chizhenzhen/p/3592396.html
Copyright © 2011-2022 走看看