动态规划。使用遍历array的同时,使用array自身来保存当前连续子数组的和,第i趟遍历时查看前i-1项中最大子数组的和,若其小于0,则将第i项的值作为前i项中最大子数组的和,否则将前i-1项最大子数组的和加上第i项的值作为前i项中最大子数组的和。前i项最大子数组的和保存在数组的第i项中。

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



下面给出一个二刷时写的版本,虽然结构复杂了,但是运行速度有所提升。

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int max;
        int sum = 0;
        for(int i = 0;i < array.size();i++){
            if(i == 0){
                sum = array.at(i);
                max = sum;
            }
            else if(sum < 0){
                sum = array.at(i);
            }
            else if(array.at(i) < 0){
                if(array.at(i) + sum < 0){
                    sum = 0;
                }
                else{
                    sum += array.at(i);
                }
            }
            else{
                sum += array.at(i);
            }
            if(sum > max){
                max = sum;
            }
        }
        return max;
    }
};