【剑指offer】面试题42:连续子数组的最大和【C++版本】

20180602

题目:

输入一个整型数组,数组里面有正数也有负数。数组中的一个或连续多个整数组成自一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n)

解题思路:

解法一:举例分析数组的规律

例如输入的数组为{1,-2,3,10,-4,7,2,-5},则计算步骤如下:
1.初始化和   s u m 为0,最大子数组和   r e s u 为0,第一步加上数字1,   s u m 为1,   r e s u 为1
2.第二步加上数字-1,和变成了-1,此时最大子数组的大小为第一步中的1,即   r e s u 为1,并且-1对之后子数组的和没有帮助,舍弃,即   s u m 归0。
3.第三步加上3,   s u m 为3,   r e s u 为3
4.第四步加上10,   s u m 为13,   r e s u 为13
5.第五步加上-4,   s u m 为9,对后面的子数组和有帮助,   r e s u 仍然为13
6.第六步加上7,   s u m 为16,   r e s u 为16
7.第七步加上2,   s u m 为18,   r e s u 为18
8.第八步加上-5,   s u m 为13,   r e s u 为18
9.结果为18

可以AC的代码(C++版本)

#include <vector>                                                                                                                                                                                                                           
#include <iostream>
#include <stdlib.h>

using namespace std;

int FindGreatestSumOfSubArray(vector<int> array)
{
    int size = array.size();
    if(size <= 0)return 0;
    int sum = array[0],resu = array[0];                //把sum和最后结果的resu初始化为第一个元素

    for(int i = 1;i != size;i++){
        if(sum < 0)                                    //如果sum的值小于0,把其置零
            sum = 0;
        sum += array[i];

        if(sum > resu)
            resu = sum;
    }

    return resu;
}

int main()
{
    vector<int> test{1,-2,3,10,-4,7,2,-5};

    cout << FindGreatestSumOfSubArray(test) << endl;

    return 0;
}

解法二:应用动态规划算法

用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出   m a x [ f ( i ) ] ,其中   0 < i < n 。而其中f(i)的计算公式如下:

f ( i ) = d a t a [ i ] ; i = 0 f ( i 1 ) <= 0

f ( i ) = f ( i 1 ) + d a t a [ i ] , i ! = 0 f ( i 1 ) > 0

可以AC的代码(C++版本)

和解法一的代码都差不多吧

#include <vector>
#include <iostream>
#include <stdlib.h>

using namespace std;

int FindGreatestSumOfSubArray(vector<int> array)
{
    int size = array.size();
    if(size <= 0)return 0;
    int preSum = array[0],sum,resu = array[0];

    for(int i = 1;i != size;i++){                                                                                                                                                                                                           
        if(preSum < 0)                      //这里主要体现动态规划的思想,实现动态规划函数
            preSum = array[i];
        else
            preSum += array[i];

        if(preSum > resu)
            resu = preSum;
    }

    return resu;
}

int main()
{
    vector<int> test{1,-2,3,10,-4,7,2,-5};

    cout << FindGreatestSumOfSubArray(test) << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37950361/article/details/80545806