一、题目要求
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如 果数组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 ",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 ",fmax); 31 for(i=a;i<b;i++) 32 { 33 printf("%d ",arry1[i]); 34 } 35 printf(" "); 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(" "); 64 compare(arry1,length); 65 return 0; 66 }
运行结果:
四、心得体会
通过这几次的结对合作,我体会到了团结的重要性,我想这也是老师的目的吧,在这之前老师总是让同学们把自己的想法说出来,他们的想法都特别的,我想着也是我的不足之处吧,我希望以后有更多的机会去互相学习,互相进步。