愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

LeetCode - 最大子序列和

一、题目

给定一个整数数组 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
}