子串最大和
来源:互联网 发布:剑网三捏脸数据怎么看 编辑:程序博客网 时间:2024/05/22 05:02
求和最大的连续子串问题
给定一整型数字a[]={a[0],...,a[n])},找出连续子串{a[x]),a[x+1],...,a[y]},使得和最大,其中,0<=x<=y<=n。要求时间复杂度为O(n)。
解决思路:
- 和最大的子串一定是以数组a中的某一个元素为结束,所以我们分别对每一个元素作为当前子串的结尾计算当前和最大的子串,再对计算出的所有子串和进行比较,最大的那个就是解。
- 计算以元素a(i+1)结尾的和最大的子串:假定以a(i)结尾的和最大子串为L[i],和为sum[i],则当sum[i]+a[i+1]>a[i+1],那L[i+1]为L[i]加上a[i+1],sum[i+1]=sum[i]+a[i+1];否则L[i+1]为a[i],sum[i+1]=a[i+1];为什么这样?注意“连续”,也就是说以a[i+1]结尾的子串必定包含a[i+1],那和最大的子串L[i+1]只能是a[i+1]或者L[i]加上a[i+1],显然,sum[i]+a[i+1]>a[i+1]则不取a[i+1]而取L[i]加上a[i+1],否则就取a[i+1];
- 原因连续则必定以a[i+1]结尾,而以a[i+1]结尾的和最大的子串要么是a[i+1],要么是L[i]+a[i+1],可以通过sum[i]和a[i+1]的符号来检查这个结论
代码如下:
structSubMax//最大和的子串
{
};
SubMax maxsub(int a[],intsize)
{
//每个一维数组含3个元素,0下标子串为开始位置,1下标为结束位置,2下标为和
}
intmain()
{
}