要求:找到数组中连续和最大的子数组
来源:算法导论,第四章
方法:分治法
思路:一个串中和最大的子数组,可能出现的位置1、前一半(不包含中间元素)
2、后一半(不包含中间元素)
3、包含中间元素 递归即可实现
不知道java怎么能返回3个值,所以创建长度为3的数组,分别存放它们(想到更好的办法再改)
这个方法其实不是很好,学到分治就写下了,其他学到再写
public class findSumMax {
public static void main(String[] args) {
int[] arr = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22,
15, -4, 7 };
int[] arrnew = findall(arr, 0, arr.length - 1);
for (int i = arrnew[0]; i <= arrnew[1]; i++) {
System.out.print(arr[i] + " ");
}
}
private static int[] findall(int[] arr, int i, int length) {
if (i >= length) {
int[] arr1 = { i, length, arr[i] };
return arr1;
} else {
int[] arr1 = findall(arr, i, (length + i) / 2); //前一半
int[] arr2 = findall(arr, (length + i) / 2 + 1, length); //后一半
int[] arr3 = findall(arr, i, (length + i) / 2, length); //含有中间元素
if (arr1[2] > arr2[2] && arr1[2] > arr3[2])
return arr1;
if (arr3[2] > arr2[2] && arr3[2] > arr1[2])
return arr3;
else
return arr2;
}
}
private static int[] findall(int[] arr, int start, int mid, int length) {
int left_sum = 0;
int right_sum = 0;
int sum = 0;
int max_left = mid;
for (int i = mid; i >= 0; i--) {
sum += arr[i];
if (sum > left_sum) {
left_sum = sum;
max_left = i;
System.out.println(sum);
}
}
sum = 0;
int max_right = mid;
for (int i = mid + 1; i <= length; i++) {
sum += arr[i];
if (sum > right_sum) {
right_sum = sum;
max_right = i;
System.out.println(sum);
}
}
int[] arr1 = { max_left, max_right, right_sum + left_sum };
return arr1;
}
}