434
社区成员
发帖
与我相关
我的任务
分享
// 计算跨越中间位置的最大字段和
int maxCrossingSum(int arr[], int left, int mid, int right) {
int leftSum = INT_MIN;
int sum = 0;
for (int i = mid; i >= left; i--) {
sum += arr[i];
leftSum = max(leftSum, sum);
}
int rightSum = INT_MIN;
sum = 0;
for (int i = mid + 1; i <= right; i++) {
sum += arr[i];
rightSum = max(rightSum, sum);
}
return leftSum + rightSum;
}
// 分治算法求最大字段和
int divideAndConquer(int arr[], int left, int right) {
// 递归结束条件
if (left == right) {
return arr[left];
}
int mid = (left + right) / 2;
// 递归求解左右两部分的最大字段和
int leftMax = divideAndConquer(arr, left, mid);
int rightMax = divideAndConquer(arr, mid + 1, right);
// 求解跨越中间位置的最大字段和
int crossMax = maxCrossingSum(arr, left, mid, right);
// 返回左右两部分、跨越中间位置的最大字段和中的最大值
return max(max(leftMax, rightMax), crossMax);
}