代码的详细解释可以参考书。注意findMaxCrossingSubarray函数,findMaximumSubArray函数返回的是一个对象,所以我们得提前定义一个SubArray 对象,考虑到封装性,将其成员变量设置为私有,并且添加有参构造函数,以及set,get方法。
public class SubArray {
private int low;
private int high;
private int sum;
public SubArray(int low, int high, int sum) {
super();
this.low = low;
this.high = high;
this.sum = sum;
}
public int getHigh() {
return high;
}
public void setHigh(int high) {
this.high = high;
}
public int getLow() {
return low;
}
public void setLow(int low) {
this.low = low;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
而后2个函数就是书上的伪代码,注意maxLeft变量和maxRight变量用之前要初始化
下面是完整代码
import java.util.Arrays;
public class FindMaximumSubArray {
public static SubArray findMaxCrossingSubarray(int[] arr,int low,int mid,int high){
int leftSum = Integer.MIN_VALUE;
int sum = 0;
int maxLeft = 0;//
for(int i = mid;i >= 0;i--){
sum += arr[i];
if(sum > leftSum){
leftSum = sum;
maxLeft = i;
}
}
int rightSum = Integer.MIN_VALUE;
int maxRight = 0;//
sum = 0;
for(int j = mid + 1;j <= high;j++){
sum += arr[j];
if(sum > rightSum){
rightSum = sum;
maxRight = j;
}
}
return new SubArray(maxLeft,maxRight,leftSum + rightSum);
}
public static SubArray findMaximumSubArray(int[] array, int low, int high) {
if (low == high) {
return new SubArray(low, high, array[low]);
} else {
int mid = (low + high) / 2;
SubArray subArrayLeft = findMaximumSubArray(array, low, mid);
SubArray subArrayRight = findMaximumSubArray(array, mid + 1, high);
SubArray subArrayCross = findMaxCrossingSubarray(array, low, mid, high);
if (subArrayLeft.getSum() > subArrayRight.getSum() && subArrayLeft.getSum() > subArrayCross.getSum()) {
return subArrayLeft;
} else if (subArrayRight.getSum() > subArrayLeft.getSum() && subArrayRight.getSum() > subArrayCross.getSum()) {
return subArrayRight;
} else {
return subArrayCross;
}
}
}
public static void main(String[] args) {
int[] array = { 8,-5,6,17,29,-36 };
SubArray subArray = findMaximumSubArray(array, 0, array.length - 1);
for(int i = subArray.getLow();i <= subArray.getHigh();i++){
System.out.print(array[i] + " ");
}
}
}
欢迎指证