1.以伪代码描述最大字段和的分治算法。
int find(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 = find(a, left, center);
int rightSum = find(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;
}
2.分析该算法的时间复杂度
该算法采用递归的方式,受长度r的影响(即数组长度n-1的影响),采用递归的方式,所以时间复杂度是O(nlogn)。
3.结合本章的学习,你对分治法的体会和思考
我认为的分治法就是把一个大问题分成小问题来做,不断细分能简化问题,然后通过回传来实现对整体的操作,对于一些看起来很复杂的问题实现简单化,通过解决小问题来解决最终的问题,要学会这种分治方法,有这样的思路,遇到问题能有效解决。