zoukankan      html  css  js  c++  java
  • 结对开发—求环数组的最大子数组的和,并返回其最大子数组3

    结对成员:信1201-1班    黄亚萍

                  信1201-1班    袁亚姣

    一、题目要求

      题目:返回一个整数数组中最大子数组的和。
      要求:
          输入一个整形数组,数组里有正数也有负数。
          数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
          如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
          同时返回最大子数组的位置。
          求所有子数组的和的最大值。要求时间复杂度为O(n)。

    二、设计思路

          这次的主要问题在于这次的一位数组要首尾相连,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大,所以我们采用以下方法寻找最大值,如输入 a1 a2 a3 a4这4位数,我们将其扩展为

                a1 a2 a3 a4 a1 a2 a3

    在第一个的基础上进行扩展,很容易得到结果,并返回最大数组

    三、源代码 

     1 #include "stdio.h"
     2 #include"stdlib.h"
     3 #include"time.h"
     4 #define N 1000 
     5 int a=0,b=0;
     6 int q=0;
     7 int compare( int arry1[],int length)
     8 {
     9     int max[N],max1,i,j,q;
    10     int fmax=max[0];
    11     int arr[N];    
    12     
    13     for(j=0;j<length;j++)
    14     {
    15         int sum=0;
    16     
    17         max1=-9876;
    18         for(i=j;i<j+length;i++)
    19         {
    20             sum=sum+arry1[i];
    21             if(sum>=max1)
    22             {
    23                 max1=sum;
    24                 q=i;
    25             }
    26         }
    27         max[j]=max1;
    28         arr[j]=q;
    29         printf("包含数组中第%d个数的所有子数组中和最大的值为:%d
    ",j+1,max[j]);
    30         if(max[j]>fmax)
    31         {
    32             fmax=max[j];
    33             a=j;
    34             b=arr[j];
    35         }
    36     }
    37     printf("所有子数组的和的最大值为:%d
    ",fmax);
    38     for(i=a;i<b+1;i++)
    39     {
    40         printf("%d ",arry1[i]);
    41     }
    42     printf("
    ");
    43     return 0;
    44 }
    45 int main(int argc, char* argv[])
    46 {
    47     int arry[N],arry1[N];
    48     int length;
    49     srand(time(NULL));
    50     printf("请输入要比较整数的个数:");
    51     scanf("%d",&length);
    52     printf("请输入整数:");
    53     for(int i=0;i<length;i++)
    54     {
    55         scanf("%d",&arry[i]);
    56     
    57     }
    58     for( i=0;i<2*length-1;i++)
    59     {
    60         if(i<length)
    61         {
    62             arry1[i]=arry[i];
    63         }
    64         else
    65         {
    66             arry1[i]=arry[i-length];
    67         }
    68         printf("%d ",arry1[i]);
    69     }
    70     printf("
    ");
    71     compare(arry1,length);
    72     return 0;
    73 }

    四、运行结果截图
         

    五、总结与心得

          通过这几次团队合作的实验中,我真正的认识到团队合作的重要性,它能够帮助我们认识到自己思维的不足与片面性,比如说,在本次实验中,求环形数组的最大子数组的和,我们通过转化,把它等价于一个展开的一维数字来进行运算,这是我们一起商讨的结果,但是同时,也有我们忽略的,也是我们的不足之处,当环形数组的元素个数的和大于0,那么环形数组的子数组是n次循环的结果的话,那最后的子数组的和的最大值对应的子数组的元素个数是无穷个。

        

  • 相关阅读:
    关于Thread ThreadPool Parallel 的一些小测试demo
    VS附加到进程调试
    netcore 实现一个简单的Grpc 服务端和客户端
    CodeSmith 找不到请求的 .Net Framework Data Provider
    ocelot集成consul服务发现
    使用ocelot作为api网关
    关于add migration 报错的问题解决方案
    关于多线程efcore dbcontext 的解决方案。
    docker mysql 容器报too many connections 引发的liunx磁盘扩容操作
    关于liunx 机器脱机环境(netcore)Nuget包迁移的问题
  • 原文地址:https://www.cnblogs.com/mudanhuakai/p/4377745.html
Copyright © 2011-2022 走看看