434
社区成员
发帖
与我相关
我的任务
分享1、伪代码描述最大字段和的分治算法
if(left==right) return a[left];
int mid=(left+right)/2;
int lmax=maxSum(left,mid); //左边最大子段和
int rmax=maxSum(mid+1,right); //右边最大子段和
//第三种情况,最大子段横跨左右两部分
int clmax=a[mid];
int temp1=a[mid];
for(int i=mid-1;i>=left;i--)
{
temp1+=a[i];
if(temp1>clmax)
clmax=temp1;
} //左边部分最大子段和
int crmax=a[mid+1];
int temp2=a[mid+1];
for(int j=mid+2;j<=right;j++)
{
temp2+=a[j];
if(temp2>crmax)
crmax=temp2;
} //右边部分最大子段和
int cmax=clmax+crmax;
int maxs=max(max(lmax,rmax),cmax);
if(maxs<0) return 0;
return maxs;
时间复杂度为
T(n)=O(1)+2T(n/2)+O(n)=O(nlogn)
分治法一共分为三个步骤:划分、求解、合并,利用递归求解子问题。计算时间复杂度时用递归方程进行分析。