最大子段和分治算法描述及代码
求子段和需要分三种情况
1、最大和在左
2、最大和在右
3、最大和为二者相加
定义中间值
int mid = (left + right) / 2;
再分情况
int l = sss(a, left, mid);
int r = sss(a, mid + 1, right);
m = s1 + s2;
完整如下:
if (left == right) return a[left];
int mid = (left + right) / 2;
int l = sss(a, left, mid);
int r = sss(a, mid + 1, right);
int s1=0, s2=0, temp=0, m;
for (int i = mid; i >= left; i--)
{
temp += a[i];
if (temp >= s1) s1 = temp;
}
temp = 0;
for (int i = mid + 1; i <= right; i++)
{
temp += a[i];
if (temp >= s2) s2 = temp;
}
m = s1 + s2;
return max(max(l, r), m);
最后比较三者大小。
感悟:
分治法就是分而治之,即层层深入逐个突破,最终解决问题。这种办法可以提高运行速度,也可以将难题化难为易,为我们解题提供了新的思路。分治法要求掌握递归的运用和不同排序的方法,要去理解并运用,只有思路清晰才能在合适的位置上很好地运用合适的代码。