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[n];
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;
}
}
最大子数组问题-分治策略解法
最新推荐文章于 2024-07-07 10:00:00 发布