剑指 Offer 42. 连续子数组的最大和
方法:动态规划
解题思路
参考动态规划详细解析——剑指 Offer 42. 连续子数组的最大和
注意:
- 很多同学首先会想到同向双指针,实际上本题由于\(nums\)数组的某一个元素的下一个元素可正可负,导致同向双指针要求的单调性无法满足;
- 使用\(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)\)。

浙公网安备 33010602011771号