題目
有一個整型數組,裏面的元素有正數和負數,一個或者連續的多個元素組成一個子數組,求所有子數組的和的最大值。也就是連續子數組最大和問題。
分析
這道題一般使用動態規劃來做,面試的時候問到也是考察動態規劃。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;
}
};