剑指offer(30)连续子数组的最大值

Posted Blog of Eric Wu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(30)连续子数组的最大值相关的知识,希望对你有一定的参考价值。

题目描述

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

 

题目分析

这题我们可以分析数组,一个一个的找规律。不过如果知道动态规划的话,很容易发现后面的结果跟前面的有关系。如果用函数sum(i)表示以第i个数字结尾的子数组的最大和,那么我们只需要求出

max[sum(i)],其中可以用如下递归公式。

当i=0时,或者sum(i-1)<=0时,sum(i)=array[i];

当i≠0时,或者sum(i-1)>0时,sum(i)=sum(i-1)+array[i];

那么就可以写代码了

 

代码

function FindGreatestSumOfSubArray(array)
{
    if(array.length<=0) return 0;
    let sum=array[0],max=array[0];
    for(let i=1;i<array.length;i++){
        if(sum<0) sum=array[i];
        else sum=sum+array[i];
        if(sum>max) max=sum;
    }
    return max;
}

 

以上是关于剑指offer(30)连续子数组的最大值的主要内容,如果未能解决你的问题,请参考以下文章

30剑指offer--连续子数组最大和

剑指offer 30.时间效率连续子数组的最大和

每日一题 - 剑指 Offer 42. 连续子数组的最大和

《剑指Offer——连续子数组的最大和,礼物的最大价值》代码

连续子数组的最大和-剑指Offer

写写代码系列013:剑指offer题目——连续子数组的最大和(动态规划)