package com.four;
public class FindMaximumSubarray {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] A = {-1,1,2,3,9,-2,5,-3};
SubscriptSum findMaxSubbary = findMaxSubbary(A, 0, A.length - 1);
System.out.println(findMaxSubbary.left + " " + findMaxSubbary.right + " " + findMaxSubbary.sum);
}
public static SubscriptSum findMaxSubbary(int[] A, int low, int high) {
if(high == low ) {
return new SubscriptSum(low, high, A[low]);
}else {
int mid = (high + low) / 2;
SubscriptSum l = findMaxSubbary(A, low, mid);
SubscriptSum r = findMaxSubbary(A, mid + 1, high);
SubscriptSum m = findMaxCrossingSubbary(A, low, mid, high);
if(l.sum >= r.sum && l.sum >= m.sum) {
return l;
}else if(r.sum >= l.sum && r.sum >= m.sum) {
return r;
}else {
return m;
}
}
}
public static SubscriptSum findMaxCrossingSubbary(int[] A, int low, int mid, int high) {
int leftSum = 0;
int rightSum = 0;
int maxleftScrip = Integer.MIN_VALUE;
int maxRightScrip = Integer.MAX_VALUE;
int sum = 0;
for(int i = mid; i >= low; i--) {
sum = sum + A[i];
if(sum > leftSum) {
leftSum = sum;
maxleftScrip = i;
}
}
sum = 0;
for(int i = mid+1; i <= high; i++) {
sum = sum + A[i];
if(sum > rightSum) {
rightSum = sum;
maxRightScrip = i;
}
}
return new SubscriptSum(maxleftScrip, maxRightScrip, leftSum + rightSum);
}
}
class SubscriptSum{
public int left;
public int right;
public int sum;
public SubscriptSum(int left, int right, int sum) {
this.left = left;
this.right = right;
this.sum = sum;
}
}