class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
vector<int> dp(n);
dp[0]=nums[0];
int answer = dp[0];
for(int i=1;i<n;i++){
dp[i] = max(dp[i-1] + nums[i], nums[i]);
answer=max(answer,dp[i]);
}
return answer;
}
};
简单的一维动态规划,可以省略数组dp
另外一种线性枚举思想,sumj-sumi为最大和
找出j前的最小sum即可:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum = nums[0];
int n=nums.size();
int minSum = min(0,sum);
int answer = nums[0];
for(int i=1;i<n;i++){
sum += nums[i];
answer=max(answer,sum - minSum);
minSum = min(minSum,sum);
}
return answer;
}
};