这道题目一开始在想遇到负数就从下一个正数开始计算,并和记录的最大和相比,但有些子序列,即使子序列中存在负数,但整体的和还是最大的,不能单纯的跳过。
- 那么只需要遍历数组,即使遇到负数也不跳过,同样加到总和中,并记录 总和,当 总和大于 最大和 时,更新最大和。
- 当 总和 小于0 时,将总和重新置为0,之前的连续子序列总和小于0,即使后续的数再大,也会拖累其成为 最大总和。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum = 0;
int maxSum = INT_MIN;
for(int i = 0; i < nums.size(); i++){
sum += nums[i];
if(sum > maxSum){
maxSum = sum;
}
if(sum < 0){
sum = 0;
}
}
return maxSum;
}
};
使用动态规划的解法:
- dp[i] 表示包括下标i之前的最大连续子序列和为dp[i]
- dp[i] = max(dp[i - 1] + nums[i], nums[i]);
- 初始化 dp[0] = nums[0];
- 从前向后进行顺序遍历
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size(), 0);
dp[0] = nums[0];
int maxSum = 0;
for(int i = 1; i < nums.size(); i++){
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
if(dp[i] > maxSum){
maxSum = dp[i];
}
}
return maxSum;
}
};