题目:
有一个整数数组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; }