53.最大子数组和

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function (nums) {
    // 动态规划,问题拆分,通过求解前一个子问题的解,对后一个子问题提供信息
    // 例如,示例 1 输入数组是 [-2,1,-3,4,-1,2,1,-5,4] ,我们可以求出以下子问题:
    // 子问题 1:以 −2 结尾的连续子数组的最大和是多少;
    // 子问题 2:以 1 结尾的连续子数组的最大和是多少;
    // 子问题 3:以 −3 结尾的连续子数组的最大和是多少;
    // ......
    var sumArr = []
    sumArr[0] = nums[0] // 以-2结尾的最大和
    var max = nums[0]
    for (var i = 1; i < nums.length; i++) {
        // 求以nums[i]结尾的最大和
        // 如果前一个子问题的最大和大于0,则加上前一个子问题的解就等于当前nums[i]结尾的最大和解
        if (sumArr[i - 1] > 0) {
            sumArr[i] = sumArr[i - 1] + nums[i]
        } else {
            sumArr[i] = nums[i]
        }

        // 最终最大和
        max = Math.max(max, sumArr[i])
    }
    return max
}

// 示例 1:
// 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
// 输出:6
// 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
console.log(maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4]));


// 示例 2:
// 输入:nums = [1]
// 输出:1
console.log(maxSubArray([1]));

// 示例 3:
// 输入:nums = [5,4,-1,7,8]
// 输出:23
console.log(maxSubArray([5, 4, -1, 7, 8]));