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);
    
    
    }

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

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

    运行结果:

    下面是分析的过程草稿:

    欢迎指正!

  • 相关阅读:
    ACM模板——次短路及K短路
    ACM模板——最小生成树
    Leetcode-743 Network Delay Time(网络延迟时间)
    ACM模板——最短路
    HDU-2037 今年暑假不AC
    Leetcode-1015 Numbers With Repeated Digits(至少有 1 位重复的数字)
    Leetcode-1014 Capacity To Ship Packages Within D Days(在 D 天内送达包裹的能力)
    Leetcode-1013 Pairs of Songs With Total Durations Divisible by 60(总持续时间可被 60 整除的歌曲)
    Leetcode-1012 Complement of Base 10 Integer(十进制整数的补码)
    LeetCode--204--计数质数
  • 原文地址:https://www.cnblogs.com/chizhenzhen/p/3592396.html
Copyright © 2011-2022 走看看