方法一:分组思想,把连续是正数部分的数据和一步步整合到最后一项去,然后 将每组的最值 做比较,就这样找到最值。
const maxSubArray = nums => {
if (nums.length === 1) return nums[0];
let max = nums[0];
for (let i = 1; i < nums.length; i++) {
// 把连续正数部分一步步累加到 该连续正数最后一项
if (nums[i - 1] > 0) {
nums[i] += nums[i - 1];
}
// 更新max
max = max > nums[i] ? max : nums[i];
}
return max;
};
方法二:假设curSum是第一个值 maxSum 是第一个值,然后进行for循环,从第二项开始算起,每进入一项,先判断,之前的curSum如果是负数就是拖了当前nums[i]的后腿了,这时候需要舍弃之前的curSum,从当前的第i项开始,重新计算,如果是nums[i]是负数,是可以被原谅的,因为有可能后续是一个大正数呢?所以会被收纳到curSum中,此时不用担心最值变化,因为在上一次已经把maxSum存好了,所以这一次虽然nums[i]的值拖了后腿了,但是maxSum依然不受到影响
const maxSubArray = nums => {
let curSum = nums[0];
let maxSum = nums[0];
for (let i = 1; i < nums.length; i++) {
// nums[i]如果小于0,应该被剔除
curSum = Math.max(nums[i], nums[i] + curSum);
// 将当前值与最大值比较,取最大
maxSum = Math.max(curSum, maxSum);
}
return maxSum;
};