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 36
| class Solution { public int maxSubArray(int[] nums) { return maxSubArray(nums, 0, nums.length - 1); }
private int maxSubArray(int[] nums, int left, int right) { if (left == right) { return nums[left]; }
int mid = (left + right) >>> 1; return max(maxSubArray(nums, left, mid), maxSubArray(nums, mid + 1, right), maxSum(nums, left, mid, right)); }
private int max(int a, int b, int c) { return Math.max(a, Math.max(b, c)); }
private int maxSum(int[] nums, int left, int mid, int right) { int sum = 0, leftMaxSum = Integer.MIN_VALUE, rightMaxSum = Integer.MIN_VALUE; for (int i = mid; i >= left; i--) { sum += nums[i]; leftMaxSum = Math.max(leftMaxSum, sum); }
sum = 0; for (int i = mid + 1; i <= right; i++) { sum += nums[i]; rightMaxSum = Math.max(rightMaxSum, sum); }
return leftMaxSum + rightMaxSum; } }
|