《编程之美》是一本很意思的讲编程的书,虽然有什么“面试心得”之说。下面是我对《编程之美》中“子数组之和的最大值”的一种解法,不知是否可行。以下为程序:
//对于全为负的数组,求单个最大值即为答案,对于全为正的数组,数组所有元素之和为答案。
//对于有正有负的,数组的开始可分二种情形:以非正数开始,以正数开始,显然要丢掉开
//始的连续的非正数,另一端也如此。这样我们把数组简化成了如下情形:+......+
//s1表示左端连续正数之和,s2表示紧随s1后的连续非正数之和,s3表示紧随s2后的连续正数之和,
//后面可以依此处理。
//问题简化成对(s1,s2,s3,s2,s3,......,s3)求子数组之和的最大值,其中s1>0,s2<0,s3>0。
//对于(s1,s2,s3当-s2
#define N 10
int max_array(int a[],int n)
{
int i,start,end,s1,s2,s3,count=0;
for(i=0;is1) s1=a[i];
}
else if(count==0)
{
s1=0;
for(i=0;i=0&&i<=end;i++)
s1+=a[i];
while(i<=end)
{
s2=0;
while(a[i]<0&&i<=end) {s2+=a[i];i++;}
s3=0;
while(a[i]>=0&&i<=end) {s3+=a[i];i++;}
if(-s2s3?s1:s3;
else if(s1+s2>0) s1=s1+s2+s3;
else s1=s3;
}
}
return s1;
}
int main()
{
int array[N],max,i;
for(i=0;i