1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public int maxSubArray(int[] nums) { return getMaxSubSum(nums, 0, nums.length - 1); }
private int getMaxSubSum(int[] nums, int left, int right) { if (left == right) { return nums[left]; } int mid = left + (right - left) / 2; int leftMaxSum = getMaxSubSum(nums, left, mid); int rightMaxSum = getMaxSubSum(nums, mid + 1, right); int crossingMaxSum = getCrossingMaxSum(nums, mid, left, right); return Math.max(Math.max(leftMaxSum, rightMaxSum), crossingMaxSum); }
private int getCrossingMaxSum(int[] nums, int mid, int left, int right) { int leftMaxSum = nums[mid]; int tempSum = nums[mid]; for (int i = mid - 1; i >= left; i--) { tempSum += nums[i]; leftMaxSum = Math.max(leftMaxSum, tempSum); }
int rightMaxSum = nums[mid + 1]; tempSum = nums[mid + 1]; for (int i = mid + 2; i <= right; i++) { tempSum += nums[i]; rightMaxSum = Math.max(rightMaxSum, tempSum); }
return leftMaxSum + rightMaxSum; }
}
|