1. 题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 题解
1、动态规划
思路:开辟数组dp,大小同nums,dp[i]表示以元素nums[i]结尾的连续子数组的最大和,根据dp[i-1]和0的关系,分为两种情况:
(1)dp[i-1] <=0,说明此时对最大和的贡献为负,因此dp[i] = nums[i],即从nums[i-1]开始的新的子数组的和;
(2)dp[i-1] > 0,说明此时对最大和的贡献为正,因此dp[i] = dp[i-1] + nums[i]。
这里可以直接在nums上进行动态规划,因此省了空间开销。
时间复杂度:O(n),
空间复杂度:O(1)。
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
let max = nums[0];
for(let i = 1; i < nums.length; i++){
nums[i] += nums[i-1] > 0 ? nums[i-1] : 0;
max = Math.max(max, nums[i]);
}
return max;
};