一、题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
二、求解
1、O(n^2)解法
由于求连续子数组和,所以可以用两层循环,第一次循环指定起点,第二层循环指定终点,则:
const maxSubArray = function(nums) {
let max = nums[0]
let l = nums.length
for (let i=0; i<l; ++i) {
let sum = 0
for (let j=i; j<l; ++j) {
sum += nums[j]
if (sum > max) {
max = sum
}
}
}
return max
}
2、O(n)解法
从动态规划角度来思考问题,我们假设Fin是最大子序列和,i表示起点下标,n表示终点下标。那么,要么是前n-1项和+n项和最大,要么是第n项最大,即有:
F(n) = Max(F(n-1)+F(n), F(n))
那么,如果是F(n-1)+F(n)
较大,则有:F(n-1)+F(n) > F(n)
,等价于:F(n-1) > 0
,
所以得出解法如下:
const maxSubArray = function(nums) {
let sum = nums[0]
let max = nums[0]
for (let i=1; i<nums.length; ++i) {
sum = sum > 0 ? sum + nums[i] : nums[i]
if (sum > max) {
max = sum
}
}
return max
}