给定一个整数数组 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]。
这里使用了动态规划。