434
社区成员
发帖
与我相关
我的任务
分享int MaxSum(int *a, int left, int right)
{
int sum = 0;
if(left == right)
{
sum = a[left]>0? a[left]:0;
}
else
{
int center = (left+right)/2;
int leftSum = MaxSum(a,left,center);
int rightSum = MaxSum(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>s2) s2 = rights;
}
sum = s1+s2;
if(sum<leftSum) sum = leftSum;
if(sum<rightSum) sum = rightSum;
}
return sum;
}
分解子问题的时间复杂度为:O(1);
求解子问题的时间复杂度为:2T(n/2);
合并子问题的时间复杂度为:O(n);
综上,该算法时间复杂度为O(nlogn);
分治法的基本思想是将一个规模较大的问题分解为若干个规模较小的子问题,这些子问题互相独立且与原问题相同。相比于之前学习过的一些方法,分治法在时间效率上有更大的优势,非常值得我们学习和使用。