分治法求和最大的子数组

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