1. 题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入 : [ - 2 , 1 , - 3 , 4 , - 1 , 2 , 1 , - 5 , 4 ] 输出 : 6 解释 :
1. 题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
2. 解题思路
这里我们使用动态规划来解决这个问题,当前最大连续子序列和sum,结果为res:
- 如果sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
- 如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字
每次遍历都比较res和sum的大小,将最大值赋值为res,遍历结束后就返回结果。
复杂度分析:
- 时间复杂度:O(n),其中n是数组nums的长度,需要对整个数组进行遍历。
- 空间复杂度:O(1)
3. 代码实现
/*** @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
let sum = 0, res = nums[0]
for(let num of nums){
sum > 0 ? sum += num : sum = num
res = Math.max(sum, res)
}
return res
};
4. 提交结果