题目
有一个整型数组,里面的元素有正数和负数,一个或者连续的多个元素组成一个子数组,求所有子数组的和的最大值。也就是连续子数组最大和问题。
分析
这道题一般使用动态规划来做,面试的时候问到也是考察动态规划。f(i)表示以i结尾的子数组的最大和。既然是以i结尾,那从何处开始呢?j在i的左边,如果A[0]到A[j]的和为负,那f(i)应该从j+1开始。那f(i)的递推公式怎么算呢?
f(i) = f(i-1) + A[i];条件是f(i-1) > 0
f(i) = A[i];条件是f(i-1) <= 0
要求的结果ans就等于所有f(i)的最大值了。
代码
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int len = array.size();
if(len == 0)
return 0;
int k_sum = array.at(0);
int max_sum = array.at(0);
for(int i = 1; i < len; i++){
if(k_sum < 0)
k_sum = array.at(i);
else
k_sum += array.at(i);
max_sum = max(k_sum, max_sum);
}
return max_sum;
}
};