#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int ans = nums[0], sum = 0;
for (int i = 0; i < nums.size(); i++)
{
sum += nums[i];
ans = max(sum, ans);
sum = max(sum, 0);
}
return ans;
}
};
class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
return maxSub(nums, 0, nums.size() - 1);
}
private:
int maxSub(vector<int> &nums, int left, int right)
{
if (left > right)
return INT_MIN;
int middle = left + (right - 1) / 2;
int left_max = maxSub(nums, left, middle - 1);
int right_max = maxSub(nums, middle + 1, right);
int ml = 0, mr = 0;
for (int i = middle - 1, sum = 0; i >= left; i--)
{
sum += nums[i];
ml = max(ml, sum);
}
for (int i = middle + 1, sum = 0; i <= right; i++)
{
sum += nums[i];
mr = max(mr, sum);
}
return max(max(left_max, right_max), ml + mr + nums[middle]);
}
};
python
class Solution:
def maxSubArray(self, A):
if not A:
return 0
cur_sum = max_sum = A[0]
for num in A[1:]:
cur_sum = max(num, cur_sum+num)
max_sum = max(max_sum, cur_sum)
return max_sum