zoukankan      html  css  js  c++  java
  • 第二次课上带电脑喽-----求整数数组子数组的最大和

    队友:迟真真

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

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

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

    思路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 }

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

                               

     

  • 相关阅读:
    ASP.NET 错误
    linux下使用蓝牙设备【转】
    AIDL Android中的远程接口 [转]
    Handler理解
    Hid Report Descriptor
    Android kernel x86 编译方法
    Android Init Language
    DBUS 资源
    Analysing Bluetooth Keyboard Traffic with hcidump
    DBUS基础知识
  • 原文地址:https://www.cnblogs.com/fengxiaolan/p/3592414.html
Copyright © 2011-2022 走看看