找出两个不相交连续子数组的最大和

来源:互联网 发布:淘宝客服该怎么做 编辑:程序博客网 时间:2024/06/04 20:00

题目:

         有一个整数数组n,a和b是n里两个互不相交的子数组。返回sum(a)+sum(b)的最大值。

分析:

新建两个数组left和right,left[i]表示n[0:i]的连续子数组的最大和,right[i]表示n[i:length-1]的连续子数组的最大和。left[i]+right[i+1]的最大值就是答案。


function twoSubArrayMaxSum($arr){    $len = count($arr);    if($len < 2){        return false;    }    $right = array();    $cur = 0;    $rmax = $arr[$len-1];    for($i=$len-1;$i>0;$i--){        $cur += $arr[$i];        $rmax = max($rmax,$cur);        //从右边开始到左边对应下标下的最大和--只需统计到下标为1        $right[$i] = $rmax;        $cur = $cur >0 ? $cur: 0;    }    $res = $lmax = $arr[0];    $cur = 0;    for($i=0;$i<$len-1;$i++){        $cur += $arr[$i];        $lmax = max($lmax,$cur);        $res = max($res,$lmax+$right[$i+1]);        $cur = $cur >0 ?: 0;    }    return $res;}