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了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章