剑指 Offer 42. 连续子数组的最大和

100 阅读1分钟

剑指 Offer 42. 连续子数组的最大和

方法一:分组思想,把连续是正数部分的数据和一步步整合到最后一项去,然后 将每组的最值 做比较,就这样找到最值。

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;
};