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

题目链接:剑指 Offer 42. 连续子数组的最大和

方法:动态规划

解题思路

参考动态规划详细解析——剑指 Offer 42. 连续子数组的最大和
注意:

  1. 很多同学首先会想到同向双指针,实际上本题由于\(nums\)数组的某一个元素的下一个元素可正可负,导致同向双指针要求的单调性无法满足;
  2. 使用\(dp\)解答时,关键一部在于\(dp\)数组含义的定义,即\(dp[i]\)表示以\(nums[i]\)结尾的子数组和的最大值,这就保证了递推过程中前后\(dp[i]\)\(dp[i + 1]\)可以联系起来(若选择\(nums[i+1]\)则可以与\(nums[i]\)连接起来成为新的子数组)。

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        int dp = nums[0], ans = nums[0];
        for (int i = 1; i < n; i ++ ) {
            dp = max(dp + nums[i], nums[i]);
            ans = max(ans, dp);
        } 
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)

posted @ 2023-04-08 23:55  lixycc  阅读(19)  评论(0)    收藏  举报