434
社区成员
发帖
与我相关
我的任务
分享将所给序列a[1:n] 分成a[1:n/2] 和 a[n/2 + 1 : n]两个部分,则最大值有一下三种情况:
int max(int *a, int left, int right) {
if (left == right) {
return a[left] < 0 ? 0 : a[left];
}
int center = (left + right) / 2;
int left = max(a, left, center);
int right = max(a, center + 1, right);
int s1 = 0;
int lefts =0;
for (int i = center; i >= left; i--) {
lefts += a[i];
if (lefts > s1) {
s1 = lefts;
}
}
int s2 = 0;
int rights = 0;
for (int i = center + 1; i <= right; i++) {
rights += a[i];
if (rights > s1) {
s1 = rights;
}
}
int sum = s0 + s1;
sum = max(sum, left);
sum = max(sum, right);
return sum;
}
int max(int *a, int n) {
return sum(a, 1, n);
}
时间复杂度:T(n) = O(1) + 2T(n / 2) + O(n) = O(nlogn)
分治是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原文题的解。