LeetCode 53.最大子串和——DP

  • 鏈接 : 原題
  • 題意 : 給定一個整數序列,找一個具有最大和的連續子串。
    在這裏插入圖片描述
  • 思路 :動態規劃。
    最近做的滑動窗口題比較多,我一開始想了半天滑動窗口,但是這題明顯不是,因爲沒有判斷條件。
    此題要O(n) 複雜度,所以肯定不能同時枚舉起點和終點,所以只枚舉重點。
    dp[i]代表的是以 第i個數字爲結尾的最大連續子串長度。
    狀態轉移方程 : dp[i] = max(dp[i-1] + nums[i], nums[i] )。
    因爲是連續子串,枚舉到i 時,要判斷的是把nums[i]加到連續子串中,或者連續子串起始變成 nums[i]。
    最後再枚舉 dp數組,最大的值即是答案。
  • 代碼 :
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int len = nums.size();
        vector<int> dp(len);
        dp[0] = nums[0];
        int ans = dp[0];
        for(int i = 1;i < len;i++){ //枚舉終點
            dp[i] = max(dp[i-1] + nums[i],nums[i]);
            ans = max(ans,dp[i]);
        }
        return ans;
    }
};
  • 遇到的問題:
    一開始以爲是滑動窗口,沒有想到是動態規劃。後來看了一眼題解,說是枚舉重點,就立刻想到dp了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章