問題重述:
題目:輸入一個整型數組,數組裏有正數也有負數。數組中一個或連續的多個整數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度爲O(n)。
例如輸入的數組爲{1,-2,3,10,-4,7,2,-5},和最大的子數組爲{3,10,-4,7,2},因此輸出爲該子數組的和爲18.
思路解析:
動態規劃方法在解決此問題的時候非常高效。
狀態定義:dp[i]表示以i結尾的連續子數組的最大和。所以最終要求dp[n-1]
狀態轉移方程:dp[i] = max(array[i], dp[i-1]+array[i])
解釋:如果當前元素爲整數,並且dp[i-1]爲負數,那麼當然結果就是隻選當前元素
代碼實現:
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array)
{
//動態規劃
int arrSize = array.size();
vector<int> dp(arrSize+1,-1);
int ret = array[0];//由於數組中可能存在負數,所以可以將結果先設置爲array[0]
for(int i =1;i<=arrSize;++i)
{
//狀態轉移方程
dp[i]=max(array[i-1], dp[i-1]+array[i-1]);
ret = max(dp[i],ret);
}
return ret;
}
};