//最大子数组问题
public class FindMaxixumSubArray {
public static void main(String[] args) {
int[] arr = {13, -3, -25, 20, -3, -16, -23, -18, 20, -7, 12, -5, -22, 15, -4, 7};
System.out.println(findMaxixumSubArray(arr, 0, arr.length - 1));
System.out.println(findMaxixumSubArray(arr));
}
public static MaxSubArrayDTO findMaxixumSubArray(int[] arr) {
if (arr.length == 0) {
return new MaxSubArrayDTO(0, 0, 0);
}
int sum = 0;
int left = 0;
MaxSubArrayDTO maxSubArrayDTO = null;
for (int i = 0; i < arr.length; i++) {
if (sum <= 0) {
sum = arr[i];
left = i;
} else {
sum = sum + arr[i];
}
if (maxSubArrayDTO == null || maxSubArrayDTO.getSum() < sum) {
maxSubArrayDTO = new MaxSubArrayDTO(left, i, sum);
}
}
return maxSubArrayDTO;
}
public static MaxSubArrayDTO findMaxixumSubArray(int[] arr, int low, int high) {
if (low == high) {
return new MaxSubArrayDTO(low, high, arr[low]);
}
int mid = (low + high) >>> 1;
MaxSubArrayDTO leftDTO = findMaxixumSubArray(arr, low, mid);
MaxSubArrayDTO rightDTO = findMaxixumSubArray(arr, mid + 1, high);
MaxSubArrayDTO midDTO = findMaxCrossingSubArray(arr, low, mid, high);
int leftSum = leftDTO.getSum();
int rightSum = rightDTO.getSum();
int midSum = midDTO.getSum();
if (leftSum >= rightSum && leftSum >= midSum) {
return leftDTO;
} else if (rightSum > leftSum && rightSum >= midSum) {
return rightDTO;
}
return midDTO;
}
private static MaxSubArrayDTO findMaxCrossingSubArray(int[] arr, int low, int mid, int high) {
int left = mid;
int right = mid + 1;
int leftSum = Integer.MIN_VALUE;
int rightSum = Integer.MIN_VALUE;
int sum = 0;
for (int i = mid; i >= low; i--) {
sum = sum + arr[i];
if (sum > leftSum) {
leftSum = sum;
left = i;
}
}
sum = 0;
for (int i = mid + 1; i <= high; i++) {
sum = sum + arr[i];
if (sum > rightSum) {
rightSum = sum;
right = i;
}
}
return new MaxSubArrayDTO(left, right, leftSum + rightSum);
}
}
class MaxSubArrayDTO {
private int left;
private int right;
private int sum;
public MaxSubArrayDTO(int left, int right, int sum) {
this.left = left;
this.right = right;
this.sum = sum;
}
public int getLeft() {
return left;
}
public void setLeft(int left) {
this.left = left;
}
public int getRight() {
return right;
}
public void setRight(int right) {
this.right = right;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
@Override
public String toString() {
return "MaxSubArrayDTO{" +
"left=" + left +
", right=" + right +
", sum=" + sum +
'}';
}
}