解法一:dp
dp[i]表示以 nums[i] 结尾的连续子数组的最大值。
dp[i] = (dp[i - 1] + nums[i], nums[i])
ans: dp数组中的最大值
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int dp = nums[0];
int ans = nums[0];
for (int i = 1; i < n; ++i) {
dp = max(dp + nums[i], nums[i]);
ans = max(ans, dp);
}
return ans;
}
};
解法二:贪心(每次尽量让前面子数组的和最大)
用一个pre记录当前位置前面连续子数组的最大值,pre+nums[i]为以nums[i]结尾的最大值,
当pre+nums[i] < 0 时,pre = 0,遍历时不断更新pre。
ans: pre + nums[i] 中的最大值
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
int pre = (nums[0] < 0) ? 0 : nums[0];
int ans = nums[0];
for (int i = 1; i < n; ++i) {
ans = max(ans, pre + nums[i]);
pre += nums[i];
if (pre < 0) pre = 0;
}
return ans;
}
};
易错点:
1:pre的初始化,如果nums[0] < 0,此时pre初始化为0.