题目链接:https://www.acwing.com/problem/content/description/50/
题目如下:
//解一:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res=INT_MIN;
int s=0;
for(auto e:nums){
if(s<0) s=0;//s记录的是到当前位置的数字和,如果是负数,则直接清零处理
s+=e;
res=max(res,s);
}
return res;
}
};
//解二:模板题目,指定k长度的连续字符串
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int k=1;//此处k为指定连续数字的长度
int l=-1;//左边界
int res=INT_MIN;
int min_pre_sum=INT_MAX;
vector<int> pre_sum(nums.size()+1);
for(int i=0;i<nums.size();i++){
pre_sum[i+1]=pre_sum[i]+nums[i];
int r=i+1-k;//长度为k的右边界
while(l<r){//搜索最小前缀和数组,从上一次停止的位置l开始
min_pre_sum=min(min_pre_sum,pre_sum[l+1]);
l++;
}
res=max(res,pre_sum[i+1]-min_pre_sum);
}
return res;
}
};
//解三:dp
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==0) return 0;
int res=nums[0];
vector<int> dp(nums.size(),0);
dp[0]=nums[0];
for(int i=1;i<nums.size();i++){
dp[i]=max(nums[i],nums[i]+dp[i-1]);
res=max(res,dp[i]);
}
return res;
}
};