53. 最大子数组和

自己做

解:滑动数组
cpp
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int begin = 0;
int end = (int)nums.size() - 1;
int sum = 0;
int max = nums[0];
//剔除左边小于0的部分
int left_count = 0;
for(int i = 0; i < (int)nums.size(); i++){
left_count += nums[i];
if(left_count > max) //记录下前面的最大值,可能会出现前面全为正,后面一个很大负数的情况,这样就会造成丢失,这里记录下来
max = left_count;
if(left_count < 0){ //找到了负值的部分,更新边界
begin = i + 1;
left_count = 0; //重置计数
}
}
//剔除右边小于0的部分
int right_count = 0;
for(int i = (int)nums.size() - 1; i > begin; i--){
right_count += nums[i];
if(right_count < 0){ //找到了负值的部分,更新边界
end = i - 1;
right_count = 0; //重置计数
}
}
//情况:如果数组中的元素全是负的(或者相加都为负,或者前面的最大子数组和都比后面找到的大),这里返回其中的最大值
if(begin >= end || max > sum)
return max;
//经过上面处理后得到对应子数组,现在遍历子数组统计
for(int i = begin; i <= end; i++)
sum += nums[i];
return sum;
}
};
