例题1.3 总和最大区间问题
给定一个实数序列,设计一个有效的算法,找到总和最大的区间
1.正反两遍扫描法伪代码(简单情况)
时间复杂度:O(N)
step1: 从左往右将序列第一个正数之前的元素删除;
step2: 从右往左将序列最后一个正数之后的元素删除,此时序列的元素个数由K缩减为k;
step3: 正向依次扫描序列:
依次记录如下3个值:
1~q的和:S(1,q),
前向扫描最大值: maxf,
最大值的右边界:r
step4: if 存在q0, 当q>q0时,S(1,q)>=0:
step5: 当扫描到q=k时,保留maxf对应的右边界r;
step6: 反向依次扫描序列:
依次记录如下3个值:
p~k的和:S(p,k),
反向扫描最大值: maxb,
最大值的左边界:l
step7: if 存在p0, 当p<p0时,S(p,k)>=0:
step8: 当扫描到p=1时,保留maxb对应的左边界l;
step9: 输出序列总和最大的区间为:[l,r]
2.正反两遍扫描法伪代码(复杂情况)
时间复杂度:O(N)
step1: 从左往右将序列第一个正数之前的元素删除;
step2: 正向依次扫描序列:
依次记录如下3个值:
1~q的和:S(1,q),
目前最大值: max,
最大值的右边界:r
step3: if S(1,q)<0:
step4: 从q开始反向计算maxb;
依次记录如下3个值:
p~q的和:S(p,q),
反向扫描最大值: maxb,
最大值的左边界:l1
step5: 第1个局部和最大区间:[1,q]间的和最大区间为:[l1,r1]
step6:从q+1开始扫描序列,重复step2
step7:if S(1,q2)<0:
step8: 从q2开始反向计算maxb;
依次记录如下3个值:
p~q的和:S(p,q),
反向扫描最大值: maxb,
最大值的左边界:l2
step9: 第2个局部和最大区间:[1,q2]间的和最大区间为:[l2,r2]
step10: 从左往右不断扫描序列,依次得到局部最大区间[li,ri]和maxi(i=1,2,3......)
step11: if maxi > max:
max = maxi
step12: 整个序列的总和最大区间:max对应的局部和最大区间[l,r]
备注:图书勘误:
p41 倒数第4行
步骤4 最大区间[li,rr]应改为最大区间[li,ri]