您的位置:首页 > 其它

最大子序列和算法

2015-09-14 14:49 246 查看
题目:求A[i]中和最大的子序列。

时间复杂度O(NlogN): 

使用分治+递归的方法。分别求出左边N/2长度的最大子序列和、右边N/2长度的最打字序列和、以及横跨这两部分且通过中间的最大和(要分别求出两边带有最中间边界的最子大序列和,将其相加),由于不是最简单的方法,这里不再赘述。

时间复杂度O(N):

遍历一遍A即可得到结果:

int MaxSubsequenceSum (Const int A[], int N)
{
int thisSu<span style="font-family: Arial, Helvetica, sans-serif;">m, MaxSum;</span>
for(int i = 0; i < N; i ++)
{
thisSum += A[i];
if(thisSum > MaxSum)
MaxSum = thisSum;
else if(thisSum < 0)
thisSum = 0;
}
return MaxSum;
}


个人分析:

算法中,thisSum每次重置,都代表前面的和为负,可不必考虑加在后面要计算的最大子序列中,即可重置thisSum,抛弃已计算过的值;重置后,只要thisSum不小于0,都可以考虑加在大子序列中,因此thisSum(s,...,e)范围包含的更小范围的子序列(s+i,...,e-j)中不会有超过已经计算过的最大值的子序列和。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: