求整数数组中和最大的子数组的和
郑云飞--韩亚华
这个问题的复杂性和不确定让我们让我们想到了枚举,求出每一个子数组的和,但这样我们我们程序的时间复杂度
将会非常高,于是我们想把办法简化它。首先我们将数组里连续的正数和负数就和,这样我们将得到一个正负相间的
整数数组。然后再对正整数数组求最大子数组,这样最大子数组必定是两头为正,有奇数个元素的数组,让后再对这
样的数组枚举。这样不能在数量级简化时间复杂度,但也会使计算得到一定简化。一下会方法:
int maxsubarray(int a[],int n) { int *temp; int newlong=0; int k=1;//标志新数组元素的正负 int t=0; int e=n; int max=0; int add=0; while(a[t]<=0) { t++; } while(a[e-1]<=0) { e--; } temp=new int[n]; for(int j=0;j<n;j++) { temp[j]=0; } for(int i=t;i<e;i++) { if(k==1) { if(a[i]>0) temp[newlong]=temp[newlong]+a[i]; else { k=-1; newlong++; } } if(k==-1) { if(a[i]<=0) temp[newlong]=temp[newlong]+a[i]; else { k=1; newlong++; i--; } } }//得到新数组 /*for(int x=0;x<=newlong;x++) { cout<<temp[x]<<" "; }*/ for(int element=1;element<=newlong+1;element=element+2)//对新数组枚举 { for(int start=0;start<=newlong+1-element;start=start+2) { for(int i=0;i<element;i++) { add=add+temp[start+i]; } if(max<add) { max=add; } add=0; } } return max; }
测试函数
int main() { int a[10]={2,4,6,-2,-78,9,8,-1,9,-3}; int themax; themax=maxsubarray(a,10); cout<<themax; }