import java.util.Arrays;
import sun.applet.Main;
public class MaxSubArray {
private final static int MAX_VALUE = 10;
private final static int LENGTH = 20;
private static class Result {
int maxLeft;
int maxRight;
int sum;
}
public static void main(String[] args) {
int[] A = new int[LENGTH];
randomIntArray(A);
Result r = maxSubArray(A, 0, A.length - 1);
int[] P = Arrays.copyOfRange(A, r.maxLeft, r.maxRight + 1);
System.out.println(Arrays.toString(A));
System.out.println(Arrays.toString(P));
}
private static void randomIntArray(int[] array) {
if(array == null) return;
for(int i = 0; i < array.length; i++) {
int pow = (int)(Math.random()*2) + 1;
array[i] = ((int)(Math.pow(-1, pow))) *
((int) (Math.random() * MAX_VALUE));
}
}
private static Result findMaxCrossSubArray(int[] A, int l, int m, int r) {
int sum = 0;
int leftSum = A[m], rightSum = A[m+1];
Result result = new Result();
result.maxLeft = m;
result.maxRight = m + 1;
for(int i = m; i > l-1; i--) {
sum += A[i];
if(sum > leftSum) {
leftSum = sum;
result.maxLeft = i;
}
}
sum = 0;
for(int i = m+1; i < r + 1; i++) {
sum += A[i];
if(sum > rightSum) {
rightSum = sum;
result.maxRight = i;
}
}
result.sum = leftSum + rightSum;
return result;
}
public static Result maxSubArray(int[] A, int l, int r) {
Result result = new Result();
result.maxLeft = l;
result.maxRight = r;
result.sum = A[l];
if(l == r) {
return result;
} else {
int m = (l + r) / 2;
Result leftResult = maxSubArray(A, l, m);
Result rightResult = maxSubArray(A, l, m);
Result crossResult = findMaxCrossSubArray(A, l, m, r);
if(leftResult.sum >= rightResult.sum &&
leftResult.sum >= crossResult.sum) {
return leftResult;
} else if(rightResult.sum >= leftResult.sum &&
rightResult.sum >= crossResult.sum) {
return rightResult;
} else return crossResult;
}
}
}
算法导论——最大子数组
最新推荐文章于 2023-04-10 18:23:08 发布