方法一:动态规划

1、创建一个数组dp,记录不同位置结尾的子数组和的最大值,有两种情况,其一,当前的元素单独作为一个子数组;其二,与前面的元素组成子数组,所以可以得到如下的状态转移方程:

dp[i] = max(array[i], array[i] + dp[i - 1]);

2、数组dp中的最大值即为连续子数组的最大和。

时间复杂度:o(n)

空间复杂度:o(n)

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // 特殊情况处理
        if (array.size() == 1)
            return array[0];
        // 记录不同位置结尾的子数组和的最大值
        vector<int> dp(array.size(), 0);
        dp[0] = array[0];
        int max_sum = INT_MIN;
        for (int i = 1; i < array.size(); i++) {
            dp[i] = max(array[i], array[i] + dp[i - 1]);
            if (dp[i] > max_sum)
                max_sum = dp[i];
        }

        return max_sum;
    }
};

上述方法,可以进一步优化空间复杂度,使用一个临时的int值来存储上一个位置的最大子数组和即可。

时间复杂度:o(n)

空间复杂度:o(1)

#include <climits>
class Solution {
  public:
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // 特殊情况处理
        if (array.size() == 1)
            return array[0];

        int max_sum = INT_MIN;
	  	// 存储上一个位置作为结尾的最大子数组和
        int temp = array[0];
        for (int i = 1; i < array.size(); i++) {
            temp = max(array[i], array[i] + temp);
            if (temp > max_sum)
                max_sum = temp;
        }

        return max_sum;
    }
};