leetcode

题目

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。

示例1:
**

  1. 输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
  2. 输出: 6
  3. 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

思路

动态规划
定义dp数组,dp[i]表示以nums[i]结尾的连续子数组的最大和
dp[0] = nums[0]
**
根据dp[i - 1] 推导dp[i]
如果dp[i - 1] <= 0, 说明dp[i - 1]会对dp[i]造成负或者0贡献,dp[i] = nums[i]
如果dp[i - 1] > 0,dp[i] = dp[i - 1] + nums[i]
最后找dp里的最大值

解题

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    // dp[i] 代表以元素 nums[i] 为结尾的连续子数组最大和
    // dp[0] = nums[0]
    const dp = [...nums]
    dp[0] = nums[0]
    for (let i = 1; i < nums.length; i++) {
        // 当 dp[i - 1] > 0 时:执行 dp[i] = dp[i-1] + nums[i] ;
        // 当 dp[i - 1] ≤0 时:执行 dp[i] = nums[i] ;

        dp[i] = nums[i] + Math.max(dp[i - 1], 0)
    }
    return Math.max(...dp)
};