// 求数组的子数组之和最大的边界
void Array::Border_Max_Sum_Sub_Array(int *data,unsigned int const length,unsigned int & L,unsigned int & R)
{
// 异常输入
if(data == NULL || length == 0 )
{
cout《"异常输入 Border_Max_Sum_Sub_Array"《endl;
return void(0);
}
// 正常输入
else
{
bool all_fushu = true ;
unsigned int max = 0;
// 检查是否所有的数是否都是负数,并记录最大值的下表
for( unsigned int i = 0;i < length;i++ )
{
if( data[i] >= 0 )
{
all_fushu = false ;
break ;
}
else if( data[i] > data[max] )
{
max = i ;
}
}
// 如果都是负数
if(all_fushu == true)
{
R = L = max+1;
return void(0);
}
// 如果不都是负数
else
{
// 核心算法 初始化
int left_sum = data[0],right_sum = data[length-1] ;
int left = 0,right =length-1;
L = left; R = right ;
// 选择前进方向
while(left < right-1)
{
if(left_sum < right_sum)
{
if(left_sum < 0)
{
left_sum = 0 ;
L = left+1 ;
}
left++;
left_sum += data[left];
}
else
{
if(right_sum < 0)
{
right_sum = 0;
R = right -1;
}
right--;
right_sum += data[right];
}
}
// 寻求结果
// 如果舍弃左半个数组,保留右半个数组
if(left_sum <= 0)
{
L = right + 1;
R++ ;
}
// 如果舍弃右半个数组,保留左半个数组
else if(right_sum <= 0){
L++;
R = left+1;
}
// 两边都不舍弃
else{
L++;R++;
}
return void(0);
}
}
}