LeetCode 剑指 Offer 42. 连续子数组的最大和

原题链接
经典求最大子数组和题目。
当然是使用最好的动态规划了,题目比较简单,但是记录一下,算是对动态规划问题的入门学习理解。
思路:

  1. dp[i] 中保留了以当前元素为最后一个元素的数组的最大子数组和。(这里相当于是在参数传入的数组上直接操作。
  2. 前后联系起来的关键是“连续”,即:如果前面的一个元素 dp[i-1] 使得自己与后面一个元素 dp[i] 的和变小,那么他肯定不被包含在和最大的子数组中,如果以 dp[i] 开头的数组可能是最大子数组,重新开始算和。即 dp[i-1] <= 0;
  3. 如果 dp[i-1] > 0,那么以 dp[i] 开头的数组就不可能是和最大的子数组,dp[i] 为原数组的值加上 dp[i-1]。
  4. 状态转移方程就得出来了(图源)。

状态转移方程
代码:

class Solution {
    
    
public:
    int maxSubArray(vector<int>& nums) {
    
    
        int maxsum = 0;
        for(int i =1; i < nums.size();i++){
    
    
            if(nums[i-1] >= 0) nums[i] += nums[i-1];
        }
        return *max_element(nums.begin(),nums.end());
    }
};

同时给出前面做过的一道动态规划题目:LeetCode 120. 三角形最小路径和

猜你喜欢

转载自blog.csdn.net/qq_43078427/article/details/109956315