给定一个数组,找到一个具备最大和的连续子数组(子数组最少包含一个元素),返回其最大和。数组
示例:spa
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
public class 最大子数组 { public static void main(String[] args) { int[] res = getMaxArray(new int[]{-2,1,-3,4,-1,2,1,-5,4},0,8); for (int i = 0; i < res.length; i++) { System.out.println(res[i]); } } private static int[] getMaxArray(int[] A,int low,int high){ if (low == high){ int[] res = {low,high,A[low]}; return res; }else { int mid = (int) Math.floor((low+high)/2); int[] left = getMaxArray(A,low,mid); int[] right = getMaxArray(A,mid+1,high); int[] cross = getCrossMaxArray(A,low,high,mid); if (left[1] >= right[1] && left[1] >= cross[1]){ return left; } else if (right[2] >= left[2] && right[2] >= cross[2]){ return right; } else{ return cross; } } } private static int[] getCrossMaxArray(int[] A,int low,int high,int mid){ int leftSum = 0; int sum1 = 0; int leftIndex = 0; for (int i = mid; i >= low; i--) { sum1 += A[i]; if (sum1 > leftSum){ leftSum = sum1; leftIndex = i; } } int rightSum = 0; int sum2 = 0; int rightIndex = 0; for (int i = mid+1; i < high; i++) { sum2 += A[i]; if (sum2 > rightSum){ rightSum = sum2; rightIndex = i; } } int res[] = {leftIndex,rightIndex,leftSum+rightSum}; return res; } }