leetcode 53 最大子序和 JavaScript

leetcode 53 最大子序和 JavaScript
在这里插入图片描述
思路(比较长,建议看完参数方面的解释之后先看代码)
动态规划,首先取nums第一个作为res,res就是我们最终返回的结果;初始化sum=0计算最大子序和
之后for循环遍历,当sum>0的时候,将当前值累加到sum,否则sum等于当前值,每次for循环结束前都会对比res和sum取最大值作为res。
这里比较难理解的是’否则sum等于当前值’,首先sum>0的时候一直累加是没问题的,因为大于0代表了累加的正收益,当累加之后发现sum往0收益和负收益方向了,说明后面这一段累加已经不是最大子序和了,这时候要舍弃前面所有的累加,重新开始计算,所以sum=当前值。
按照这个思路其实还有一个疑惑,当sum>0的时候累加,万一下次累加的是负值,那sum就变小了,会不会影响最终的结果?这里在最后判断res和sum取最大值很巧妙地将这个条件限制住了,也就是说,虽然sum变小,但由于每次for循环都有Math.max的判断,变小了没关系,万一后面更长的一段在累加的时候反超,也是有可能的;那又绕回sum<=0的时候重置,为什么小于等于0了就不行咧,万一后面又累加上来反超了?好了,这个时候很明显,负收益的那段已经拖了后退,那如果我不要这段负收益,那么反超的不是更多?所以才有了上面说的‘舍弃前面所有的累加’。缕清思路之后我又想到一个比较极端的情况,就是sum<=0的时候舍弃前面的累加,也就是sum直接=当前值,万一这个值是负的咋办,好了我又想通了,下次for循环sum会判断sum的大小,负的会继续pass掉(以上思路最好在看懂代码之后再看,列举了多种情况,代码上都非常简洁地卡住相关边界问题)

代码如下:

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let res = nums[0];
    let sum = 0;
    nums.forEach(item=>{
        if(sum>0){
            sum+=item;
        }
        else sum=item;
        res = Math.max(sum,res)
    })
    ;
    return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值