leetcode題解 - 動態規劃(1)

寫在前面:

題目描述:

給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

標準解法:

1,定關係:自變量爲x,f(x)是以x爲結尾的數組中的最大子序和;f(x) = max(f(x - 1), nums[x])
2,表格優化代碼:結果即爲數組f中的最大值
   ---》再優化,其實我們只需要f中的前一個元素,來做比較就好
class Solution
{
public:
    int maxSubArray(vector<int> &nums)
    {
        //類似尋找最大最小值的題目,初始值一定要定義成理論上的最小最大值
        int result = INT_MIN;
        int numsSize = int(nums.size());
        //dp[i]表示nums中以nums[i]結尾的最大子序和
        vector<int> dp(numsSize);
        dp[0] = nums[0];
        result = dp[0];
        for (int i = 1; i < numsSize; i++)
        {
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
            result = max(result, dp[i]);
        }

        return result;
    }
};

再次優化:以int dp 代替 數組dp

class Solution
{
public:
    int maxSubArray(vector<int> &nums)
    {
        //類似尋找最大最小值的題目,初始值一定要定義成理論上的最小最大值
        int result = INT_MIN;
        int numsSize = int(nums.size());
        //因爲只需要知道dp的前一項,我們用int代替一維數組
        int dp(nums[0]);
        result = dp;
        for (int i = 1; i < numsSize; i++)
        {
            dp = max(dp + nums[i], nums[i]);
            result = max(result, dp);
        }

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