题目链接
题目分析
输入:[-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6
这道题其实就是需要考虑一个负数的问题
如果说这个数组里面全是正数,那么从头到尾一直加下去就完事了
可是如果说下一个数是负数,那么势必会将之前相加得到的 sum 减小
我们先将 sum设置为 index为 1代表的数,然后将下一个数字与它进行比较
如果下一个数字为正数,那么 num就要更新,变成旧的 sum与下一个数字相加得到的结果
如果是负数,当然 sum不用更新了,因为负数会使 sum值变小
↑上面是很容易想到的思路,那么能不能简单的去实现呢?
在这里我们需要定义一个 maxToCurr的变量,设置它的初始值为nums[0]
该变量的旨在 进行前面的值和下一个数字的比较
无论maxToCurr或者下一个数字的值正负与否,我们总是取 他俩值的和 与 下一数字的值,这两者的最大值
将这个最大值与先前的 sum进行比较,哪个大,更新后的 sum就是它
如果后面的数字都是正数,那么sum也就是maxToCurr不断更新的值
当然,如果后面的值出现了负数,在maxToCurr被减小后
sum与maxToCurr进行比较,也能保证sum是满足要求的
代码实现
public class Solution {
public int maxSubArray(int[] nums) {
int maxToCurr = nums[0];
int sum = nums[0];
for (int i = 1; i < nums.length; i++) {
maxToCurr = Math.max(maxToCurr + nums[i], nums[i]);
sum = Math.max(sum, maxToCurr);
}
return sum;
}
}
PS: 代码很简单,可能看我的分析会让读者看的一头雾水→语文没好好学啊...