第42题 – 连续子数组的最大和

作者: 周伟林 分类: 剑指offer 发布时间: 2018-05-23 12:29

牛客链接

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

解题思路

(动态规划)
dp[i]表示以元素array[i]结尾的最大连续子数组和.
以[-2, -3, 4, -1, -2, 1, 5, -3]为例
可以发现,
dp[i] = max{dp[i-1]+array[i],array[i]}.
即dp = [-2, -3, 4, 3, 1, 2, 7, 4];

JavaScript实现

// 时间O(n) 空间O(n)
function FindGreatestSumOfSubArray(array)
{
    let n = array.length, dp = [array[0]];
    for(let i = 1; i < n; ++i){
        dp.push(Math.max(dp[i-1]+array[i], array[i]));
    }
    return Math.max(...dp);
}

let arr = [-2, -3, 4, -1, -2, 1, 5, -3];
console.log(FindGreatestSumOfSubArray(arr));    // 7

发表评论

电子邮件地址不会被公开。 必填项已用*标注