int maxSubArray(vector<int>& nums) {
int result = nums[0]; // 要求子数组最少包含一个元素,
// 当数组中都为负数和0时,需要返回最大的一个值
int current = 0;
for(int i = 0;i < nums.size();i++){
current += nums[i];
if(current > result){
result = current;
}
if(current < 0){
current = 0;
}
}
return result;
}
int maxSubArray(vector<int>& nums) {
int local = nums[0];
int global = nums[0];
for(int i = 1;i < nums.size();i++){
local = max(nums[i], local + nums[i]);
global = max(local, global);
}
return global;
}
int maxSubArrayRecursion(std::vector<int>& nums, int start, int stop){
if(stop < start){
return INT_MIN;//注意此处不是返回0,比如{-2,-1},
//分治以后变为左中右n{},-1,{-2}三部分。左半部分{}应返回INT_MIN,
//因为还要和右半部分的返回值进行比较,最终正确结果返回-1。
//若左半部分返回0,0>-2,且大于左中右的最大组合值(-1),最终结果返回0,出错
}
if(stop == start){
return nums[start];
}
int mid = (stop - start + 1) / 2 + start;
int leftSum = maxSubArrayRecursion(nums, start, mid - 1);
int rightSum = maxSubArrayRecursion(nums, mid + 1, stop);
int midSum = nums[mid];
int tmp = nums[mid];
for(int i = mid - 1; i >= start; i--){
tmp += nums[i];
midSum = std::max(tmp, midSum);
}
tmp = midSum;
for(int i = mid + 1; i <= stop; i++){
tmp += nums[i];
midSum = std::max(tmp, midSum);
}
return std::max(std::max(leftSum, rightSum), midSum);
}
int maxSubArray(vector<int>& nums) {
return maxSubArrayRecursion(nums, 0, nums.size() - 1);
}