求连续的子数组的和
郭志伟&王扣柱
算法一:
具体思路:
1.创建一个数组,首先在主函数里判断是否全为负数,若全部是负数则直接选出最大值即可,否则调用addMax(int n,int*a)函数
2.在addMax函数里首先设置max=0,再设置一个中间值median=0;
3.for循环从数组的第一个数开始加起median=median+a[i];如果值为负就舍去,在下次循环时从新给median赋值一个新的数值,如果和大于0则与max比较,若大于max就max=median,否则继续循环重复上述步骤直到循环结束
代码如下:
#include<iostream>
using namespace std;
int addMax(int n,int*a)
{
int i,max=0,median=0;
for(i=0;i<n;i++)
{
if(median<0)
median=a[i];
else
median=median+a[i];
if(max<median)
max=median;
}
return max;
}
int main()
{
int a[7]={-1,-4,5,-6,9,8,-1};
int i,m=0,max=0;
for(i=0;i<7;i++)//判断是否全为负数
{
if(a[i]<0)
m++;
}
if(m=7)
{
max=a[0];
for(i=1;i<7;i++)
{
if(max<a[i])
max=a[i];
}
}
else
{
max=addMax(7,a);
}
cout<<max<<endl;
return 0;
}
算法二:
具体思路:
1.创建一个数组,首先在主函数里判断是否全为负数,若全部是负数则直接选出最大值即可,否则调用函数进行具体运算
2.两两合并,即正数与正数合并,负数与负数合并,若两头中任意一头有负数,则先排除它,最终变味+-+-+-+...+-+形式
3.从开头取三个数必为+-+形式,求和,如果和大于三个数之中任意一个正数则合并它们,否则取下一组三个数+-+并按刚才方法进行比较
4.通过多次比较来缩减范围,最后形成+-+三个数来做最终比较,然后输出
5.例:1 -2 -3 5 -1 4 3 -2 7
1 -5 5 -1 7 -2 7
1 -5 11 -2 7
1 -5 16
结果:max=16
注:此算法的代码实现略复杂,在此暂不做讲述,日后有机会再实现它