給定一個數組,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。數組
示例: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; } }