PHP算法之最大连续子数组

/**
 * @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));

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值