1)可以遍历两次数组,第一次求最大的,可以使用上述函数,第二次求和为负的最小字段和
2)可以一次遍历,但在循环里设两套变量,分别求最大和最小
#include<iostream>
using namespace std;
int MaxSum(int n,int *a);
int MinSum(int n,int *a);
int MaxSumAbs(int n, int *a);
int main()
{
int a[] = {2,11,4,13,5,2};
int maxSum=MaxSum(sizeof(a)/sizeof(int), a);
int minSum=MinSum(sizeof(a)/sizeof(int), a);
cout<<maxSum<<" "<<minSum<<endl;
cout<<MaxSumAbs(sizeof(a)/sizeof(int), a)<<endl;
system("pause");
return 0;
}
int MaxSum(int n,int *a) //最大子段和
{
int sum=INT_MIN,b=0;
for(int i=0; i< n; i++)
{
if(b<0)
{
b=a[i];
}
else
{
b+=a[i];
}
if(b>sum)
{
sum = b;
}
}
return sum;
}
int MinSum(int n,int *a) //最小子段和
{
int sum=0,b=0;
for(int i=0; i< n; i++)
{
if(b<0)
{
b+=a[i];
}
else
{
b=a[i];
}
if(b<sum)
{
sum = b;
}
}
return abs(sum);
}
int MaxSumAbs(int n, int *a){ //一个函数里同时求最大最小,遍历一次数组
int poiSum=INT_MIN,poiTemp=0, negSum=0, negTemp=0;
for(int i=0; i<n; i++){
if(poiTemp < 0)
poiTemp=a[i];
else poiTemp += a[i];
if(poiTemp > poiSum)
poiSum=poiTemp;
if(negTemp > 0)
negTemp=a[i];
else negTemp += a[i];
if(negTemp < negSum)
negSum=negTemp;
}
cout<<poiSum<<" "<<negSum<<endl;
return (poiSum > abs(negSum)) ? poiSum : abs(negSum);
}