题目链接:53.最大子序和
题目描述
难度 简单 描述 给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组[4,-1,2,1] 的和最大,为6 。
示例 2: 输入:nums = [1] 输出:1
示例 3: 输入:nums = [0] 输出:0
示例 4: 输入:nums = [-1] 输出:-1
示例 5: 输入:nums = [-100000] 输出:-100000
提示: 1 <= nums.length <= 3 * 104 -105 <= nums[i] <= 105
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
自行解法
一开始并没有想到合适的解法,于是想到最暴力的方式,获取所有子序和并比较
class Solution {
/**
* 出所有的子序和之后进行比较
* @param Integer[] $nums
* @return Integer
*/
function maxSubArray($nums) {
$maxForI = [];
for ($i = 0; $i < count($nums); $i++) {
$sumForI = $nums[$i];
$maxForJ = [];
$max = max($nums);
for ($j = $i + 1; $j < count($nums); $j++) {
if ($i == $j) {
$sumForI = $nums[$i];
} else {
$sumForI += $nums[$j];
}
$maxForJ[] = max($maxNum, $sumForI, $max);
$maxNum = $sumForI;
}
if (count($nums) == 1) {
$maxForJ = $nums;
}
$maxForI[$i] = max($maxForJ);
}
return max($maxForI);
}
}
这种方式可以通过绝大部分测试用例,但是当$nums增加到一定数量级后会超时
其他解法
经过查阅资料,发现这里会有更好的解法
class Solution {
/**
* @param Integer[] $nums
* @return Integer
*/
function maxSubArray($nums) {
$res = $nums[0];
$sum = 0;
foreach ($nums as $num) {
if ($sum > 0) {
$sum += $num;
} else {
$sum = $num;
}
$res = max($res, $sum);
}
return $res;
}
}