package orgi2;
import java.util.Arrays;
public class MaxArray {
/**
* 分治法求和最大的子数组
* @param args
*/
public static void main(String[] args) {
int[] arr={13,-3,25,20,-4,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
System.out.println(Arrays.toString(findmax(arr)));
}
public static int[] findmax(int[] arr){
return findmax(arr, 0, arr.length-1);
}
public static int[] findmax(int[] arr,int low,int high){
if(low==high)
return fill(low, high, arr[low]);
else{
int mid=(low+high)/2;
//求左边最大子数组
int[] findmax = findmax(arr, low, mid);
//求右边最大子数组
int[] findmax2 = findmax(arr, mid+1, high);
//求中间最大子数组
int[] findmax3=findmediuMax(arr,low,mid,high);
if(findmax3[2]>findmax[2] && findmax3[2]>findmax2[2])
return findmax3;
else if(findmax2[2]>findmax[2] && findmax2[2]>findmax3[2])
return findmax2;
else
return findmax;
}
}
private static int[] findmediuMax(int[] arr, int low, int mid, int high) {
//保存mid开始到low最大和,和脚标
int leftSum=Integer.MIN_VALUE,leftIndex=-1,rightSum=Integer.MIN_VALUE,rightIndex=-1,sum=0;
//求从mid到数组左边的最大和 和位置
for(int i=mid;i>=low;i--){
sum+=arr[i];
if(sum>leftSum){
leftSum=sum;
leftIndex=i;
}
}
sum=0;
//求从mid到数组右边的最大和 和位置
for(int i=mid+1;i<=high;i++){
sum+=arr[i];
if(sum>rightSum){
rightSum=sum;
rightIndex=i;
}
}
return fill(leftIndex, rightIndex, leftSum+rightSum);
}
public static int[] fill(int low,int high,int sum){
int[] result =new int[3];
result[0]=low;
result[1]=high;
result[2]=sum;
return result;
}
}
分治法求和最大的子数组
猜你喜欢
转载自blog.csdn.net/qq_26680031/article/details/75734755
今日推荐
周排行