求二维数组子数组和中最大的值(二)

2014-07-19 23:04:39 · 作者: · 浏览: 266

 

  // 求数组的子数组之和最大的边界

  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);

  }

  }

  }