434
社区成员
发帖
与我相关
我的任务
分享1.首先判断字段内的数,若该字段只有一个整数且该整数不大于0,则最大字段为该数,若该数小于0则最大字段为1。
2.若字段内整数个数大于一,用分治法求最大字段。
int max(int a[], int left, int right){
int sum, maxleft, maxright;
if (left == right)
{
if (a[left] >= 0)
sum = a[left];
else
sum = 0;
}
else
{
int mid = (left + right) / 2;
maxleft = max(a, left, mid);
maxright = max(a, mid + 1, right);
int s1 = 0, s2 = 0;
int temp1 = 0;
for (int i = mid; i >= left; i--)
{
temp1 += a[i];
if(s1 < temp1)
s1 = temp1;
}
int temp2 = 0;
for (int i = mid + 1; i <= right; i++)
{
temp2 += a[i];
if(s2 < temp2)
s2 = temp2;
}
sum = s1 + s2;
if (sum < maxleft)
sum = maxleft;
if (sum < maxright)
sum = maxright;
}
return sum;
}
分解子问题的时间复杂度为O(1)
求解子问题时间复杂度为O(n/2)
合并子问题的时间复杂度O(n)
总的时间复杂度为O(nlogn)
运用分治法,可以将一个大问题分解为若干个子问题,递归地解决各个子问题,然后将各个子问题的解合并得到原问题的解。运用分治法,虽然提高了解决问题的空间复杂度,但是却可以降低时间复杂度,从而提高解决问题的效率,递归细化问题,使问题的复杂程度降低。该方法可以在许多例子中体现,如二分搜索、合并排序、大整数的乘法、快速排序等,我们应当学习并且熟练运用该方法,以在解决这类问题时可以达到更高的效率,让代码更简洁,时间复杂度更低。