1.思想:将数组分治为三部分来进行求解:以中间为划分,最大字数组可能在左半部分,也可能在右半部分,也可能跨越中间。
2.参考算法导论,实现用java代码:
public class FenzhiArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr={-6,4,-3,2,5,-6,9,-8};
max(arr,0,arr.length/2,arr.length-1);
}
static void max(int []arr, int low, int mid, int high) {
int sum = 0;
//左侧的最大值为中间的数
int left_sum = arr[mid];
//求和的数
sum = 0;
int left_index=0;
//从中间往两边走
for (int i = mid; i >= low; i--) {
sum += arr[i];
if (sum > left_sum)
{left_sum = sum;
left_index=i;}
}
//求右侧的最大
int right_index=0;
int right_sum = arr[mid + 1];
sum = 0;
for (int j= mid + 1; j<= high; j++) {
sum += arr[j];
if (sum > right_sum)
{right_sum = sum;
right_index=j;}
}
System.out.println("左边的索引为"+left_index);
System.out.println("左边的索引为"+right_index);
System.out.println("最大值为:"+(left_sum+right_sum));
printArr(arr,left_index,right_index);
}
//为了打印数组的元素
static void printArr(int []arr,int startIndex, int endIndex)
{
for (int i = startIndex; i <= endIndex; i++)
{
System.out.print(arr[i] + " ");
}
}
}