第二次课上带电脑喽-----求整数数组子数组的最大和

队友:迟真真

这次软件工程课堂上,建民老师又让我们结对编程(其实,还挺好玩的,虽然自己编程不怎滴,不过这种教学方法真的很好呢!),进入主题......

题目如下:求一个整型数组的最大子数组的和

一拿到题目,真真和我就开始吧嗒吧嗒地讨论,好像没有头绪,你一言我一语思路就来了:

思路1:

定义一个max,定义一个整数元素数组。先求出相邻元素为一个元素时的最大值赋给max;

                                                       再相邻元素为2个元素时的最大值赋给max;

                                                       相邻元素为3个元素时的最大值赋给max;

                                                       相邻元素为4个元素时的最大值赋给max;

                                                       。。。

课上并没有调试出结果,课下调试正确。

代码:

 1 #include<stdio.h>
 2 #define M 100
 3 void main()
 4 { 
 5     int a[M];
 6     int i,j,N;
 7     int m=0,max=0;
 8         int n;
 9     printf("输入数组个数  ");
10     scanf("%d",&n);
11     N=n-1;
12     printf("输入数组元素  ");
13     for(i=0;i<n;i++)
14     scanf("%d",&a[i]);
15         for(i=0;i<n;i++)    //比较一个元素时的最大值
16     {
17         if(a[i]>max)
18         {
19             max=a[i];
20         }
21     }
22 
23     while(N>0)     //比较相邻2,3。。n个相邻元素时的最大值
24     {
25        for(i=0;i<N;i++)
26        { 
27            m=0;
28            for(j=0;j<=(n-N);j++)  //计算相邻的(n-N+1)的和,赋给m
29            {
30                m=m+a[i+j];
31            }
32            if(m>max)
33            {
34             max=m;
35            }
36          }
37        N--;   
38     }
39     printf("最大为:%d
",max);
40 
41   
42 }

还有一种算法,思路大致相同:

思路2:

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]

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

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

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

下面还有一种类似的算法,她是先把单个元素的子数组单另出来求得:

代码:

 1 #include<stdio.h>
 2 void main()
 3 {
 4     int a[100];
 5     int i,j,n;
 6     int k;
 7     int m=0,max;
 8     printf("请输入数组元素的个数:");
 9     scanf("%d",&n);
10     printf("请输入数组元素:");
11     for(i=0;i<n;i++)
12         scanf("%d",&a[i]);
13 
14     max=a[0];
15     for(i=0;i<n;i++)
16     {    
17         
18         for(j=i;j<n;j++)
19         {
20             m=0;
21             for(k=i;k<=j;k++)
22             {
23                 m=m+a[k];
24             }
25             if(m>max)
26             {
27                 max=m;
28             }
29         }
30     }
31     printf("最大子数组的和为:%d
",max);
32 
33 
34 }

结对编程,很能锻炼合作能力,交流能力,培养和队友的默契。

                           

 

原文地址:https://www.cnblogs.com/fengxiaolan/p/3592414.html