结对开发--求环数组的最大字数组

本文介绍了一种在首尾相连的整数数组中找到最大子数组和及其位置的方法,通过扩展数组并遍历来实现O(n)的时间复杂度。

一、题目要求

  题目:返回一个整数数组中最大子数组的和。
  要求:
  输入一个整形数组,数组里有正数也有负数。
  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  如 果数组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 compare( int arry1[],int length)
 7 {
 8     int max[N],max1,i,j;
 9     int fmax=max[0];
10     for(j=0;j<length;j++)
11     {
12         int sum=0;
13         
14         max1=-9876;
15         for(i=j;i<j+length;i++)
16         {
17             sum=sum+arry1[i];
18             if(sum>=max1)
19                 max1=sum;
20         }
21         max[j]=max1;
22         printf("包含数组中第%d个数的所有子数组中和最大的值为:%d\n",j+1,max[j]);
23         if(max[j]>fmax)
24         {
25             fmax=max[j];
26             a=j;
27             b=i;
28         }
29     }
30     printf("所有子数组的和的最大值为:%d\n",fmax);
31     for(i=a;i<b;i++)
32     {
33         printf("%d ",arry1[i]);
34     }
35     printf("\n");
36     return 0;
37 }
38 int main(int argc, char* argv[])
39 {
40     int arry[N],arry1[N];
41     int length;
42     srand(time(NULL));
43     printf("请输入要比较整数的个数:");
44     scanf("%d",&length);
45     printf("请输入整数");
46     for(int i=0;i<length;i++)
47     {
48         scanf("%d",&arry[i]);
49     
50     }
51     for( i=0;i<2*length-1;i++)
52     {
53         if(i<length)
54         {
55             arry1[i]=arry[i];
56         }
57         else
58         {
59             arry1[i]=arry[i-length];
60         }
61         printf("%d ",arry1[i]);
62     }
63     printf("\n");
64     compare(arry1,length);
65     return 0;
66 }

运行结果:

四、心得体会

      通过这几次的结对合作,我体会到了团结的重要性,我想这也是老师的目的吧,在这之前老师总是让同学们把自己的想法说出来,他们的想法都特别的,我想着也是我的不足之处吧,我希望以后有更多的机会去互相学习,互相进步。

     

转载于:https://www.cnblogs.com/yuanyajiao/p/4376683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值