一.题目:
返回一个整数数组中最大子数组的和。
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)。
二.设计思想。
将接收的数组放到a[i],将接收的数组中的所有子数组的和放到b[i]中,然后找出最大值max,即为该数组的最大子数组和。
将最大值的脚标放到s[i]中,求出 最大子数组的首个数字的脚标s[i],与连续相加数字的个数t[i]。
三.代码。
#include<iostream.h> #define MAX 10000 int main() { int k,t[MAX],o=0,d=0; int n=0,m=0; int b[MAX],a[MAX]; int s[MAX]; cout<<"请输入数组中整数的个数:"<<endl; cin>>k; for(int i=0;i<k;i++) { cin>>a[i]; } for(int l=1;l<k+1;l++) { for(i=0;i<k-l+1;i++) { for(int j=i;j<i+l;j++) { if(j>k-1) { break; } else m=m+a[j]; } b[n]=m; m=0; n=n+1; } } int max=b[0]; for(i=1;i<n;i++) { if(max<b[i]) max=b[i]; } for(i=0;i<n;i++) { if(max==b[i]) { s[d]=i+1; d++; } } int r=k; for(i=0;i<d;i++) { t[i]=0; for(int j=0;j<k;j++) { if(s[i]>=r&&r>=0) { s[i]=s[i]-r; t[i]=t[i]+1; r=r-1; } if(s[i]==0&&r>0&&j!=k-1) { s[i]=s[i]+r+1; break; } if(s[i]==0&&r==0&&t[i]==k) { s[i]=s[i]+1; break; } } r=k; } cout<<"该数组中的最大子数组的和为:"<<max<<endl; cout<<"这样的子数组一共有"<<d<<"组"<<endl; for(i=0;i<d;i++) { s[i]=s[i]-1; } for(i=0;i<d;i++) { if(d==1) cout<<"该子数组为:"; else cout<<"第"<<i+1<<"组子数组为:"; if(t[i]==0) { t[i]=1; } for(int j=s[i];j<s[i]+t[i];j++) { cout<<a[j]<<" "; } cout<<endl; } return 0; }
四.运行结果。
五.体会。
结对开发可以使得小组有更多的设计思路,可以拓展每个人的思路,从中找出更加简便的算法,有问题时两个人可以互相讨论,更好地解决问题。
当一个人编程时,另外的人可以从旁观者的角度更好的能发现一些问题。避免自己编程时出现问题,找不出问题原因。
结对开发最好的方面就是使得程序更加优化。
六.工作照片。