class Solution {
public:
int maxSubArray(vector<int>& nums) {
// 1. 确定dp数组以及下标含义
// dp[i] 是指截至到i元素出现的最大和
// 2. 状态转移方程
// 加上nums[i] or 重新开始
// dp[i] = max(dp[i-1]+nums[i], nums[i]);
// res = max(res, dp[i]) // 保存当前最大值
// 3.初值
// dp[0] = nums[0]
// res = dp[0]
// 遍历顺序
// for(int i = 1; i < nums.zie()-1; i++)
// 举例
// i 0 1 2 3 4 5 6 7 8
// nums[i] -2 1 -3 4 -1 2 1 -5 4
// dp[i] -2 1 -2 4 3 5 6 -1 4
// res -2 1 1 4 4 5 6 6 6
vector<int> dp(nums.size()); // vector<int> dp(len);
int res = nums[0];
dp[0] = nums[0];
for(int i=1; i<nums.size(); i++){
dp[i] = max(dp[i-1]+nums[i], nums[i]);
res = max(res, dp[i]);
}
return res;
}
};
可以优化只用两个变量,而不是开辟一个新的数组
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = nums[0];
int pre = nums[0];
for(int i=1; i<nums.size(); i++){
pre = max(pre+nums[i], nums[i]);
res = max(res, pre);
}
return res;
}
};