434
社区成员
发帖
与我相关
我的任务
分享三种情况:
情况1:最大字段和全部取自左边
情况2:最大字段和全部取自右边
情况3:最大字段和两边都取
(1)伪代码:
int maxSum(int a[],int left,int right) {
int sum = 0;
if(left == right)
{
if(a[left] > 0) sum = a[left];
else sum = 0;
}
else
{
int center = (left + right) / 2;
int leftsum = maxSum(a, left, center);
int rightsum = maxSum(a, center + 1, right);
int s1 ,lefts = 0;
for(int i = center ; i >= left; i--) {
lefts += a[i];
if(lefts > s1) s1 = lefts;
}
int s2 ,rights = 0;
for(int i = center + 1 ; i <= right; i++) {
rights += a[i];
if(rights > s2) s2 = rights;
}
sum = s1 + s2;
if(sum < leftsum) sum = leftsum;
if(sum < rightsum) sum = rightsum;
}
return sum;
}
(2)时间复杂度
T(n)=O(1)+2T(n/2)+O(n)=O(nlogn)
感悟
分治法就是分而治之,将一个规模为n的问题分解为k个规模比较小的字问题,这些子问题相互独立且与原问题相同。然后递归的解决子问题,再将子问题合并成员问题。
在处理这类问题时分治法一共分为三个步骤:划分、求解、合并,利用递归求解子问题。