最大子数组问题
//最大子数组问题 public class FindMaxixumSubArray { public static void main(String[] args) { int[] arr = {13, -3, -25, 20, -3, -16, -23, -18, 20, -7, 12, -5, -22, 15, -4, 7}; System.out.println(findMaxixumSubArray(arr, 0, arr.length - 1)); System.out.println(findMaxixumSubArray(arr)); } public static MaxSubArrayDTO findMaxixumSubArray(int[] arr) { if (arr.length == 0) { return new MaxSubArrayDTO(0, 0, 0); } int sum = 0; int left = 0; MaxSubArrayDTO maxSubArrayDTO = null; for (int i = 0; i < arr.length; i++) { if (sum <= 0) { sum = arr[i]; left = i; } else { sum = sum + arr[i]; } if (maxSubArrayDTO == null || maxSubArrayDTO.getSum() < sum) { maxSubArrayDTO = new MaxSubArrayDTO(left, i, sum); } } return maxSubArrayDTO; } public static MaxSubArrayDTO findMaxixumSubArray(int[] arr, int low, int high) { if (low == high) { return new MaxSubArrayDTO(low, high, arr[low]); } int mid = (low + high) >>> 1; MaxSubArrayDTO leftDTO = findMaxixumSubArray(arr, low, mid); MaxSubArrayDTO rightDTO = findMaxixumSubArray(arr, mid + 1, high); MaxSubArrayDTO midDTO = findMaxCrossingSubArray(arr, low, mid, high); int leftSum = leftDTO.getSum(); int rightSum = rightDTO.getSum(); int midSum = midDTO.getSum(); if (leftSum >= rightSum && leftSum >= midSum) { return leftDTO; } else if (rightSum > leftSum && rightSum >= midSum) { return rightDTO; } return midDTO; } private static MaxSubArrayDTO findMaxCrossingSubArray(int[] arr, int low, int mid, int high) { int left = mid; int right = mid + 1; int leftSum = Integer.MIN_VALUE; int rightSum = Integer.MIN_VALUE; int sum = 0; for (int i = mid; i >= low; i--) { sum = sum + arr[i]; if (sum > leftSum) { leftSum = sum; left = i; } } sum = 0; for (int i = mid + 1; i <= high; i++) { sum = sum + arr[i]; if (sum > rightSum) { rightSum = sum; right = i; } } return new MaxSubArrayDTO(left, right, leftSum + rightSum); } } class MaxSubArrayDTO { private int left; private int right; private int sum; public MaxSubArrayDTO(int left, int right, int sum) { this.left = left; this.right = right; this.sum = sum; } public int getLeft() { return left; } public void setLeft(int left) { this.left = left; } public int getRight() { return right; } public void setRight(int right) { this.right = right; } public int getSum() { return sum; } public void setSum(int sum) { this.sum = sum; } @Override public String toString() { return "MaxSubArrayDTO{" + "left=" + left + ", right=" + right + ", sum=" + sum + '}'; } }