/**
* @author beggar 770793038@qq.com
* @param type $arr
* @param type $begin
* @param type $end
* @return type
*/
function MaxSubArray($arr, $begin, $end){
if(empty($arr)){
return array();
}
if($begin == $end){
return array($begin, $end, $arr[$begin]);
}
$middle = (int)(($begin+$end)/2);
list($left_low, $left_high, $left_sum) = MaxSubArray($arr, $begin, $middle);
list($right_low, $right_high, $right_sum) = MaxSubArray($arr, $middle+1, $end);
list($cross_low, $cross_high, $cross_sum) = FindCrossMaxSubArray($arr, $begin, $middle, $end);
if($left_sum > $right_sum && $left_sum > $cross_sum){
return array($left_low, $left_high, $left_sum);
}elseif($right_sum > $left_sum && $right_sum > $cross_sum){
return array($right_low, $right_high, $right_sum);
}else{
return array($cross_low, $cross_high, $cross_sum);
}
}
function FindCrossMaxSubArray($arr, $begin, $middle, $end){
$left_max = 0;
$left_sum = 0;
$left_low = 0;
for($i=$middle; $i>=$begin; $i--){
$left_sum += $arr[$i];
if($left_sum > $left_max){
$left_max = $left_sum;
$left_low = $i;
}
}
$right_max = 0;
$right_sum = 0;
$right_high = 0;
for($i=$middle+1; $i<=$end; $i++){
$right_sum += $arr[$i];
if($right_sum > $right_max){
$right_max = $right_sum;
$right_high = $i;
}
}
return array($left_low, $right_high, $left_max+$right_max);
}
$arr = array(10, -4, 3, 7, -2, 21, 19, 16, -8);
print_r(MaxSubArray($arr, 0, 8));
PHP算法之最大连续子数组
最新推荐文章于 2021-04-15 02:20:44 发布