public class FindMaxSubarray { public static int findMaxCrossingSubarray(int[] a, int low, int mid, int high) { int left_sum = 0, right_sum = 0; int sum = 0; for (int i = mid; i >= 0; --i) { sum += a[i]; if (sum > left_sum) { left_sum = sum; } } sum = 0; for (int j = mid + 1; j <= high; ++j) { sum += a[j]; if (sum > right_sum) { right_sum = sum; } } return left_sum + right_sum; } public static int findMaximumSubarray(int[] a, int low, int high) { int mid = 0; int leftSum = 0, rightSum = 0, crossSum = 0; if (high == low) { return a[low]; } else { mid = low + (high - low) / 2; leftSum = findMaximumSubarray(a, low, mid); rightSum = findMaximumSubarray(a, mid + 1, high); crossSum = findMaxCrossingSubarray(a, low, mid, high); if (leftSum >= rightSum && leftSum >= crossSum) { return leftSum; } else if (rightSum >= leftSum && rightSum >= crossSum) { return rightSum; } else return crossSum; } } public static void main(String[] args) { int[] a = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}; int sum = findMaximumSubarray(a, 0, a.length - 1); System.out.println(sum); } }
java分治数组出现_最大子数组—— Java -分治策略
最新推荐文章于 2021-08-28 13:47:44 发布