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

20180602

总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】

题目:

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

解题思路:

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

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

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

#include                                                                                                                                                                                                                            
#include 
#include 

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个数字结尾的子数组的最大和,那么我们需要求出  max[f(i)]    m a x [ f ( i ) ] ,其中  0<i<n    0 < i < n 。而其中f(i)的计算公式如下:

f(i)=data[i];i=0f(i1)<=0  f ( i ) = d a t a [ i ] ; i = 0 或 者 f ( i − 1 ) <= 0

f(i)=f(i1)+data[i],i!=0f(i1)>0  f ( i ) = f ( i − 1 ) + d a t a [ i ] , i ! = 0 并 且 f ( i − 1 ) > 0

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

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

#include 
#include 
#include 

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;
}

你可能感兴趣的:(C++)