我的js算法爬坑之旅-最大子序和

132 阅读1分钟

第十一天:力扣第53题,最大子序和

地址:leetcode-cn.com/problems/ma…

思路:刚开始很傻,想用暴力破解,结果超时:

var maxSubArray = function(nums) {
    let a = nums[0];
    var c = 0;
    for(let i = 0;i<nums.length;i++)
    {
        for(let j = i ;j<nums.length;j++ )
        {
            for(let k = i;k<=j;k++)
            {
                c = c + nums[k];
            }
            if(c>a)
            {
                a = c ;
            }
            c=0;
        }
    }
    return a;

};

后来想想,可以从动态规划入手:

用 f(i) 代表以第i个数结尾的「连续子数组的最大和」

用c表示f(i-1)与f(i)之间的关系处理。

var maxSubArray = function(nums) {
    let a = nums[0];
    var c = 0;
    for(let i = 0;i<nums.length;i++)
    {
        c = Math.max(c+nums[i],nums[i]);
        a = Math.max(a,c);
    }
    return a;

};

我也不知道如何去解释,可以带入实例来运算看看,不知道怎么表达了,c是来累计的,但是又要获取较大的项,然后与a比较,若是c大,则赋值给a,若是c小,则继续累计。

执行用时:76 ms, 在所有 JavaScript 提交中击败了97.41%的用户
内存消耗:39.3 MB, 在所有 JavaScript 提交中击败了12.93%的用户