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;
}
}
};