最大连续和

思路:设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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值