最大子数组 public class MaxSubarray { public class MaxSubarray { public static void main(String[] args) { MaxSubarray subarray = new MaxSubarray(); List<integer> numbers = Arrays.asList(13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-14,7); /*List<integer> numbers = Arrays.asList(1, 4, -3, 5, -5);*/ Subarray maxSubarray = subarray.findMaxSubarray(numbers, 0, numbers.size() - 1); System.out.println(maxSubarray.low + " " + maxSubarray.high + " " + maxSubarray.sum); } class Subarray{ private int low; private int high; private int sum; public Subarray(int low, int high, int sum) { super(); this.low = low; this.high = high; this.sum = sum; } } /** * 返回跨越中点的最大子数组的边界和值 * @param numbers 数组 * @param 下标low * @param 下标mid * @param 下标high * @return */ Subarray findMaxCrossingSubarray(List<integer> numbers, int low, int mid, int high){ int leftSum = Integer.MIN_VALUE; int maxLeft = 0; int sum = 0; for(int i = mid; i >= low; i--){ sum += numbers.get(i); if(sum > leftSum){ leftSum = sum; maxLeft = i; } } sum = 0; int rightSum = Integer.MIN_VALUE; int maxRight = 0; for (int i = mid + 1; i <= high; i++) { sum += numbers.get(i); if(sum > rightSum){ rightSum = sum; maxRight = i; } } return new Subarray(maxLeft, maxRight, leftSum + rightSum) ; } /** * 返回最大子数组 * @param numbers 数组 * @param 下标low * @param 下标high * @return */ Subarray findMaxSubarray(List<integer> numbers, int low, int high){ if(high == low){ return new Subarray(low, high, numbers.get(low)); }else{ int mid = (low + high)/2; Subarray leftSubarray = findMaxSubarray(numbers, low, mid); Subarray rightSubarray = findMaxSubarray(numbers, mid + 1, high); Subarray crossingSubarray = findMaxCrossingSubarray(numbers, low, mid, high); if(leftSubarray.sum >= rightSubarray.sum && leftSubarray.sum >= crossingSubarray.sum){ return leftSubarray; }else if(rightSubarray.sum >= leftSubarray.sum && rightSubarray.sum >= crossingSubarray.sum){ return rightSubarray; }else{ return crossingSubarray; } } } 结果: