4.1 求最大子数组问题
实例:求数组A=[-1, 2, 4, -5, 7, 8, 9, -10]中和最大的子数组
java代码
package algorithm.demo;
public class MaxSubArrayFinder {
static int[] findMaxCrossingSubArray(int[] a, int low, int mid, int high) {
int leftSum = -Integer.MAX_VALUE;
int rightSum = -Integer.MAX_VALUE;
int sum = 0;
int maxLeft = mid, maxRight = mid+1;
for (int i = mid; i >= low; i--) {
sum += a[i];
if (sum > leftSum) {
leftSum = sum;
maxLeft = i;
}
}
sum = 0;
for (int j = mid+1; j <= high; j++) {
sum += a[j];
if (sum > rightSum) {
rightSum = sum;
maxRight = j;
}
}
return new int[]{maxLeft, maxRight, (leftSum+rightSum)};
}
static int[] findMaxSubArray(int[] a, int low, int high) {
if (low == high) {
printInfo(low, high, low, high, a[low]);
return new int[]{low, high, a[low]};
} else {
int mid = ((low+high)-(low+high)%2)/2; // (low+high)/2 向下取整
int[] leftArray = findMaxSubArray(a, low, mid);
int[] rightArray = findMaxSubArray(a, mid+1, high);
int[] crossArray = findMaxCrossingSubArray(a, low, mid, high);
if (leftArray[2] > rightArray[2] &&
leftArray[2] > crossArray[2]) {
printInfo(low, high, leftArray[0], leftArray[1], leftArray[2]);
return leftArray;
} else if (rightArray[2] > leftArray[2] &&
rightArray[2] > crossArray[2]) {
printInfo(low, high, rightArray[0], rightArray[1], rightArray[2]);
return rightArray;
} else {
printInfo(low, high, crossArray[0], crossArray[1], crossArray[2]);
return crossArray;
}
}
}
static void printInfo(int low, int high, int maxLeft, int maxRight, int sum) {
System.out.println("Array["+low+", "+high+"]"+
" max subarray:["+maxLeft+", "+maxRight+"] sum:"+sum);
}
public static void main(String[] args) {
int[] a = {-1, 2, 4, -5, 7, 8, 9, -10};
findMaxSubArray(a, 0, a.length-1);
}
}
运行结果
Array[0, 0] max subarray:[0, 0] sum:-1
Array[1, 1] max subarray:[1, 1] sum:2
Array[0, 1] max subarray:[1, 1] sum:2
Array[2, 2] max subarray:[2, 2] sum:4
Array[3, 3] max subarray:[3, 3] sum:-5
Array[2, 3] max subarray:[2, 2] sum:4
Array[0, 3] max subarray:[1, 2] sum:6
Array[4, 4] max subarray:[4, 4] sum:7
Array[5, 5] max subarray:[5, 5] sum:8
Array[4, 5] max subarray:[4, 5] sum:15
Array[6, 6] max subarray:[6, 6] sum:9
Array[7, 7] max subarray:[7, 7] sum:-10
Array[6, 7] max subarray:[6, 6] sum:9
Array[4, 7] max subarray:[4, 6] sum:24
Array[0, 7] max subarray:[1, 6] sum:25