程序员面试题100题第03题——求子数组的最大和

题目:输入一个整型数组,数组里有整数也有负数。数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

分析:

方法一:

当我们加上一个正数时和会增加,当我们加上一个负数时,和会减少。如果当前和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。

int FindMaxsumOfSubarray(const vector<int>& vec)
{
    int sum=0;
    int MaxSum=0;
    for(vector<int>::size_type i=0; i<vec.size(); i++)
    {
        sum += vec[i];

        if(sum < 0)
            sum=0;
        if(sum > MaxSum)
            MaxSum=sum;
    }

    if(MaxSum==0)//if all data are negative ,find the max in vec
    {
        MaxSum = vec[0];
        for(vector<int>::size_type i=1; i<vec.size(); i++)
        {
            sum = vec[i];
            if(sum > MaxSum)
                MaxSum=sum;
        }
    }
    return MaxSum;
}

方法二:

《编程之美》2.14求子数组之和的最大值

posted @ 2012-10-03 14:21  logzh  阅读(215)  评论(0编辑  收藏  举报