您的位置:首页 > 其它

最大子数组问题-分治策略解法

2018-04-02 18:52 260 查看
import java.util.Random;
import java.util.Scanner;

/*
* 最大子数组问题-分治策略解法
*/
public class MaxSubArray {
static class Data {
int low;
int high;
int num;

public Data(int low, int high, int num) {
super();
this.low = low;
this.high = high;
this.num = num;
}

public Data() {
super();
}

}

public static void main(String[] args) {
Random random = new Random();
int n;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[] arr = new int
;
for (int i = 0; i < n; i++) {
arr[i] = random.nextInt() % 50;
System.out.print(arr[i] + " ");
}
Data data = findMaximumSubArray(arr, 0, arr.length - 1);

System.out.println("\n" + (data.low + 1) + " " + (data.high + 1) + " " + data.num);
}

private static Data findMaximumSubArray(int[] arr, int low, int high) {
if (low >= high) {
return new Data(low, high, arr[low]);
}
int mid = (low + high) / 2;
Data dataLeft = findMaximumSubArray(arr, low, mid);
Data dataRight = findMaximumSubArray(arr, low, mid);
Data dataCross = findMaxCrossingSubArray(arr, low, mid, high);
if (dataLeft.num > dataRight.num && dataLeft.num > dataCross.num) {
return dataLeft;
} else if (dataRight.num > dataLeft.num && dataRight.num > dataCross.num) {
return dataRight;
} else {
return dataCross;
}
}

private static Data findMaxCrossingSubArray(int[] arr, int low, int mid, int high) {
Data data = new Data();
int num = 0;
int maxNumLeft = Integer.MIN_VALUE;
int maxLeftIndex = mid;
for (int i = mid; i >= low; i--) {
num += arr[i];
if (num > maxNumLeft) {
maxNumLeft = num;
maxLeftIndex = i;
}
}

num = 0;
int maxNumRight = Integer.MIN_VALUE;
int maxRightIndex = mid + 1;
for (int i = mid + 1; i <= high; i++) {
num += arr[i];
if (num > maxNumRight) {
maxNumRight = num;
maxRightIndex = i;
}
}
data.low = maxLeftIndex;
data.high = maxRightIndex;
data.num = maxNumLeft + maxNumRight;
return data;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: