53.Maximum Subarray
class Solution {
public:
struct SubArray{
int low;
int high;
int sum;
SubArray(int _low, int _high, int _sum):low(_low), high(_high), sum(_sum){}
};
int maxSubArray(vector<int>& nums) {
SubArray result = findMaxSubarray(nums, 0, nums.size()-1);
return result.sum;
}
SubArray findMaxCrossingSubarray(vector<int>& input, int low, int mid, int high){
int leftSum = INT_MIN, rightSum = INT_MIN;
int sum = 0, left = mid, right = mid;
for (int i = mid; i >= low; --i) {
sum = sum + input[i];
if(sum > leftSum){
leftSum = sum;
left = i;
}
}
sum = 0;
for (int j = mid + 1; j <= high; ++j) {
sum = sum + input[j];
if(sum > rightSum){
rightSum = sum;
right = j;
}
}
return SubArray(left, right, leftSum + rightSum);
}
SubArray findMaxSubarray(vector<int> &input, int low, int high){
int mid = 0;
if(low == high)
return SubArray(low, high, input[low]);
else{
mid = (low + high) / 2;
SubArray subArrayLeft = findMaxSubarray(input, low, mid);
SubArray subArrayRight = findMaxSubarray(input, mid + 1, high);
SubArray subArrayCross = findMaxCrossingSubarray(input, low, mid, high);
if(subArrayLeft.sum >= subArrayRight.sum && subArrayLeft.sum >= subArrayCross.sum)
return subArrayLeft;
else if(subArrayRight.sum >= subArrayLeft.sum && subArrayRight.sum >= subArrayCross.sum)
return subArrayRight;
else
return subArrayCross;
}
}
};