题目
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
**
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [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)
};
