public static Tuple findMax(int[] A, int low, int high){
Tuple<Integer, Integer, Integer> tuple = new Tuple<>();
if (low == high) {
tuple.left = low;
tuple.right = high;
tuple.sum = A[low];
return tuple;
} else {
int mid = (low + high)/2;
Tuple<Integer, Integer, Integer> lTuple = findMax(A, low, mid);
Tuple<Integer, Integer, Integer> cTuple = findCrossMax(A, low, mid, high);
Tuple<Integer, Integer, Integer> rTuple = findMax(A, mid + 1, high);
if (lTuple.sum > cTuple.sum && lTuple.sum > rTuple.sum) {
return lTuple;
} else if (rTuple.sum > cTuple.sum && rTuple.sum > lTuple.sum) {
return rTuple;
} else {
return cTuple;
}
}
}
public static Tuple findCrossMax(int[] A, int low, int mid, int high){
Tuple<Integer, Integer, Integer> tuple = new Tuple<>();
int lSum = Integer.MIN_VALUE;
int temp = 0;
int l = -1;
for (int i = mid; i >= low; i--) {
temp += A[i];
if (temp > lSum) {
lSum = temp;
l = i;
}
}
int rSum = Integer.MIN_VALUE;
int r = -1;
temp = 0;
for (int i = mid; i <= high; i++) {
temp += A[i];
if (temp > rSum) {
rSum = temp;
r= i;
}
}
tuple.left=l;
tuple.right=r;
tuple.sum = lSum + rSum - A[mid];
return tuple;
}