53 最大连续子数组和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

思路:

要获取最大的和,则起始之数必然要小于等于之前的和。同时要使用贪心原则,一直遍历到最后,获取最大的和。

代码如下:

<?php

$a = [-1,1,-3,4,-1,2,1,-5,4];

$max = $tmpMax = 0;
$left = $right = 0;

for($i=0; $i<count($a); $i++) {
    $tmpMax += $a[$i];

    if ($tmpMax <= $a[$i]) {
        $tmpMax = $a[$i];
        $left = $i;
    }

    if ($tmpMax > $max) {
        $max = $tmpMax;
        $right = $i;
    }
}

var_dump($max,$left,$right);

结果:

/opt/wwwroot/test/test1.php:22:int 6
/opt/wwwroot/test/test1.php:22:int 3
/opt/wwwroot/test/test1.php:22:int 6

最大值为6,从$a[3]到$a[6],即[4,-1,2,1]。

这里使用了动态规划。

猜你喜欢

转载自my.oschina.net/u/3412738/blog/2413638