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

来源:互联网 发布:关于我的命运知乎 编辑:程序博客网 时间:2024/05/29 19:17

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

可以用动态规划来解决这个问题,用函数f(i)表示以第i个整数结尾的子数组的最大和,当以第i-1个整数结尾的子数组的最大和小于0时,此时以第i个整数结尾的子数组的最大和即为它自身,当以第i-1个整数结尾的子数组的最大和大于0时,以第i个整数结尾的子数组的最大和为第i个整数加上以第i-1个整数结尾的子数组的最大和即可。用一个临时数组存下每个以第i个整数结尾的子数组的最大和,再从这个临时数组中找出最大值即整形数组的子数组的最大值。

代码如下:

class Solution {public:    int FindGreatestSumOfSubArray(vector<int> array) {    int size = array.size();        if(size==0)            return 0;        if(size==1)            return array[0];        int tmp[size];        tmp[0]=array[0];        for(int i=1; i<size; ++i)        {            if(tmp[i-1]<=0)                tmp[i]=array[i];            else                tmp[i]=array[i]+tmp[i-1];        }        int max=tmp[0];        for(int j=1; j<size; ++j)        {            if(max<tmp[j])                max=tmp[j];        }        return max;    }};


0 0