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

团队成员:迟真真 冯小兰

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

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

子数组的元素个数为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);


}

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

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

 

运行结果:

下面是分析的过程草稿:

欢迎指正!

 

 

转载于:https://www.cnblogs.com/chizhenzhen/p/3592396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值