题解 | #连续子数组的最大和(二)#

连续子数组的最大和(二)

http://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21

思路

  • 遍历数组
  • 找最大连续子数组
    • 即在前一个资产为负时,抛弃前面资产,重新求资;
    • 若前一个资产为正时,继续求资。
  • 循环过程中记录左右节点位置,当资产没有变小且长度变大时,更新最大左右节点位置

代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param array int整型一维数组 
 * @return int整型一维数组
 */
/**
 * 找连续子数组的最大和
 * 同时,记录left和right左右节点的位置
 */
function FindGreatestSumOfSubArray( array ) {
    // write code here
    // 先处理特殊情况,数组长度为1
    if(array.length==1)
        return array;
    // 初始化定义左右节点的位置
    // 注意,同时声明两个变量,要分开分别赋值
    var left=0,right=0;
    // 初始化定义,最大左右节点的位置
    var lposmax=0,rposmax=0;
    // 初始化定义前几个的和为第一个元素值
    var dp=[];
    dp[0]=array[0];
    // 初始化定义最大和为dp[0]
    var maxsum=dp[0];
    // 从第二个元素开始循环遍历
    for(let i=1;i<array.length;i++){
        right++;
        // 转移矩阵,最大和
        dp[i]=Math.max(dp[i-1]+array[i],array[i])
        // 如果资产dp为负值,则舍弃掉dp,位置更新,区间新起点
        if(dp[i-1]<0)
            left=right;
        // 若出现以下两种情况,需更新左右位置和最大值
        // ①出现更大的dp
        // ②在dp没变化或者变大的情况下,目前长度也变长了
        // 为什么第2种情况有问题呢?明明符合条件呀,maxsum未变但长度变大,要更新的
        if(dp[i]>maxsum || dp[i]==maxsum && (right-left)>(rposmax-lposmax)){
            lposmax=left;
            rposmax=right;
            maxsum=dp[i]
        }
    }
    // 数组裁剪
    console.log(lposmax)
    console.log(rposmax)
    return array.slice(lposmax,rposmax+1);
}
module.exports = {
    FindGreatestSumOfSubArray : FindGreatestSumOfSubArray
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务