创建三个变量:presum;nowsum;maxsum;
presum表示遍历到当前元素之前的“相对大的”和;
nowsum表示遍历到当前元素时的和(presum加上nums[i]的和);
maxsum表示输出的最大和;
for对每个元素挨个遍历
如果presum前面元素的和小于0,说明前面的和应该舍去,加到后面只会减小最大和,此时最大和应该从当前元素开始算,maxsum,nowsum,presum都从该元素开始重新算,maxsum记录整个过程中的最大和.
如果前面元素和presum大于0,则应该继续往后加,后面可能会越加越大,分别记录nowsum,presum的值,maxsum记录过程中的最大值.
最后输出maxsum.
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int presum=nums[0];
int nowsum=nums[0];
int maxsum=nums[0];
for(int i=1;i<nums.size();i++){
if(presum<0){
nowsum=nums[i];
presum=nums[i];
}else{
nowsum+=nums[i];
presum=nowsum;
}
maxsum=max(nowsum,maxsum);
}
return maxsum;
}
};