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

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

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param array int整型一维数组
 * @return int整型一维数组
 */
function FindGreatestSumOfSubArray(array) {
    // 动态规划:状态转移数组dp[i]表示以下标i为终点的最大连续子数组和
    // dp[i] = max(dp[i - 1] + array[i], dp[i])
    // dp[i]只有两个方向可以推出来:
    // dp[i - 1] + array[i],即:array[i]加入当前连续子序列和
    // array[i],即:从头开始计算当前连续子序列和
    let dp = [];
    dp[0] = array[0];
    let max = dp[0];
    // 记录每次连续子数组的首尾索引
    let start = 0;
    let end = 0;
    // 记录最大且区间最长的连续子数组的首尾索引
    let maxStart = 0;
    let maxEnd = 0;
    for (let i = 1; i < array.length; i++) {
        end++;
        // 状态转移
        dp[i] = Math.max(dp[i - 1] + array[i], array[i]);
        // 更新区间新起点
        if (dp[i - 1] + array[i] < array[i]) {
            start = end;
        }
        if (dp[i] > max || (dp[i] === max && (end - start) > (maxEnd - maxStart))) {
            maxStart = start;
            maxEnd = end;
            max = dp[i];
        }
    }
    let res = [];
    for (let i = maxStart; i <= maxEnd; i++) {
        res.push(array[i]);
    }
    return res;
}
module.exports = {
    FindGreatestSumOfSubArray: FindGreatestSumOfSubArray,
};

全部评论

相关推荐

刘湘_passion:太强了牛肉哥有被激励到
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务