class Solution {
public int maxSubArray(int[] nums) {
return getMax(nums,0,nums.length-1);
}
private int getMax(int[] nums,int l, int r) {
// 递归结束条件 单个元素 终止
if (l == r) {
return nums[l];
}
// 二分法
int mid =l +(r-l)/2;
// 拿到左边最大元素值
int leftMaxValue = getMax(nums,l,mid);
// 拿到右边元素最大值
int rightMaxValue = getMax(nums,mid+1,r);
// 取到中间值元素最大值
int midMaxValue =getCrossMaxValue(nums,l,r);
return Math.max(midMaxValue,Math.max(leftMaxValue,rightMaxValue));
}
private int getCrossMaxValue(int[] nums ,int l ,int r) {
// 获取中间下标
int mid = (r-l)/2 +l;
// 定义左边最大值变量和中间变量
int leftValue = nums[mid];
int leftMaxValue = leftValue;
// 循环递减的方式 统计左边的变量值
for (int i =mid-1;i>=l;i--) {
leftValue +=nums[i];
leftMaxValue = Math.max(leftMaxValue,leftValue);
}
// 定义右边最大值变量和中间变量
int rightValue = nums[mid+1];
int rightMaxValue = rightValue;
// 循环递减的方式 统计右边的变量值
for (int i =mid+2;i<=r;i++) {
rightValue +=nums[i];
rightMaxValue = Math.max(rightMaxValue,rightValue);
}
return rightMaxValue+leftMaxValue;
}
}