团队成员:迟真真 冯小兰
求一个整型数组的最大子数组的和
看到这个题目,是这样想的:
子数组的元素个数为1个,2个,3个、、、、、n个
#include<stdio.h> #define M 100 void main() { int a[M]; int i,j,N; int m=0,max=0; int n; printf("输入数组个数 "); scanf("%d",&n); N=n-1; printf("输入数组元素 "); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) //比较一个元素时的最大值 { if(a[i]>max) { max=a[i]; } } while(N>0) //比较相邻2,3。。n个相邻元素时的最大值 { for(i=0;i<N;i++) { m=0; for(j=0;j<=(n-N);j++) //计算相邻的(n-N+1)的和,赋给m { m=m+a[i+j]; } if(m>max) { max=m; } } N--; } printf("最大为:%d",max); }
后来又想了一种这样的方法,如下:
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]
因此可以找到规律,然后用3个for循环语句。
#include<stdio.h> void main() { int a[100]; int i,j,n; int k; int m=0,max; printf("请输入数组元素的个数:"); scanf("%d",&n); printf("请输入数组元素:"); for(i=0;i<n;i++) scanf("%d",&a[i]); max=a[0]; for(i=0;i<n;i++) { for(j=i;j<n;j++) { m=0; for(k=i;k<=j;k++) { m=m+a[k]; } if(m>max) { max=m; } } } printf("最大子数组的和为:%d\n",max); }
但是考虑到时间空间复杂度,这种方法貌似不太好
可以先比较出和的最大值,把这些和的最大值放在一个数组中,然后再求这个数组的最大值。
运行结果:
下面是分析的过程草稿:
欢迎指正!