思路:设sum[i] 为前i个元素中,包含第i个元素且和最大的连续子数组,result 为已找到的子数组中和最大的。对第i+1个元素有两种选择:做为新子数组的第一个元素、放入前面找到的子数组。
sum[i+1] = max(a[i+1], sum[i] + a[i+1])
result = max(result, sum[i])
// 方法一
function max_sum_arr($arr) {
$count = count($arr);
if ($count <= 0) {
return 0;
}
$max = $res[0] = $arr[0];
for ($i = 1; $i < $count; $i++) {
$res[$i] = max($res[$i - 1] + $arr[$i], $arr[$i]);
if ($max < $res[$i]) {
$max = $res[$i];
}
}
return $max;
}
//方法二
function max_sum_array($arr)
{
$currSum = 0;
//数组元素全为负的情况,返回最大数
$maxSum = $arr[0];
$n = count($arr);
for ($i = 0; $i < $n; $i++) {
if ($currSum >= 0) {
//如果加上某个元素,sum>=0的话,就加
$currSum += $arr[$i];
} else {
//如果加上某个元素,sum<0了,就不加
$currSum = $arr[$i];
}
if ($currSum > $maxSum) {
$maxSum = $currSum;
}
}
return $maxSum;
}
// 优化版
function max_sum_arr($arr) {
$count = count($arr);
if ($count <= 0) {
return 0;
}
$max = $cur = $arr[0];
for ($i = 1; $i < $count; $i++) {
$cur = ($cur + $arr[$i]) > $arr[$i] ? ($cur + $arr[$i]) : $arr[$i];
if ($max < $cur) {
$max = $cur;
}
}
return $max;
}
时间复杂度 O(n)。