劍指offer刷題————連續子數組的最大和

問題重述:

題目:輸入一個整型數組,數組裏有正數也有負數。數組中一個或連續的多個整數組成一個子數組。求所有子數組的和的最大值。要求時間複雜度爲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;
    }
};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章