class Solution {
public:
int maxSubArray0(vector<int>& nums) {
if(nums.size() == 0) return 0;
int sum = 0x80000000;
int cur = 0;
// 滑动窗口
for(int i = 0; i <nums.size(); i++){
if(cur < 0) cur = nums[i];
else cur += nums[i];
if(cur > sum) sum = cur;
}
return sum;
}
int maxSubArray1(vector<int>& nums) {
if(nums.empty()) return 0;
vector<int> dp(nums.size()+1, 0);
dp[0] = nums[0];
int res = dp[0];
for(int i =1; i <nums.size(); i++){
dp[i] = max(0, dp[i-1]) + nums[i];
if(res < dp[i]) res = dp[i];
}
return res;
}
int maxSubArray(vector<int>& nums) {
if (nums.empty()) return 0;
int res = nums[0];
for(int i =1; i <nums.size(); i++){
nums[i] = nums[i] + max(nums[i-1], 0);
res = max(res, nums[i]);
}
return res;
}
};
两种思想:
一、滑动窗口
若a[0,i]之间的数据相加为负数,那么0-i之间的数据应该丢弃,应该从i+1的数据算起,当然i+1到i+1如果为负数,同样放弃,从i+2开始算起,每加一个数都要记录下来最值
二、动态规划
dp[i] = dp[i-1]+nums[i], if dp[i-1]>0
dp[i] = nums[i], if dp[i-1]<0
实际上在我看来,和上面的思想是类似的