天天看点

分治策略算法之最大字数组和问题

public int[] getResultInSonArray(int start,int end,int[] arr){
		//结束条件
		if(start==end){
			int[] result = new int[3];
			result[0] = start;
			result[1] = end;
			result[2] = arr[start];
			return result;
		}
		int mid = (start+end)>>1;//向右移动;
		int[] leftresult = getResultInSonArray(start, mid, arr);
		int[] rightresult = getResultInSonArray(mid+1, end, arr);
		int[] midresult = getResultInSonArrayIncludeMid(start,end,mid,arr);
		if(leftresult[2]>rightresult[2]&&leftresult[2]>midresult[2]){
			return leftresult;
		}else if(rightresult[2]>leftresult[2]&&rightresult[2]>midresult[2]){
			return rightresult;
		}else {
			return midresult;
		}
		//return null;
	}
	public int[] getResultInSonArrayIncludeMid(int start, int end, int mid,int[] arr){
		int left_sum = 0;
		int right_sum = 0;
		int temp1 = Integer.MIN_VALUE;	//左边最大值;
		int temp2 = Integer.MIN_VALUE;//右边最大值;
		int[] result = new int[3];
		for(int i=mid;i>=start;i--){
			left_sum += arr[i];
			if(left_sum>temp1){
				temp1 = left_sum;
				result[0] = i;
			}
		}
		for(int j = mid+1;j<end;j++){
			right_sum += arr[j];
			if(right_sum>temp2){
				temp2 = right_sum;
				result[1] = j;
			}
		}
		int sum = 0;
		for(int k=result[0];k<=result[1];k++){
			sum+=arr[k];
		}
		result[2] = sum;
		
		return result;
	}
}
           

继续阅读