最短子序列和问题

有n个正整数组成一个 序列。给定整数s, 求长度最短的连续序列, 使他们的最大和大于或等于S。

书中给出3种思路, 先上图:

A.  暴力枚举起点和终点,并且依次求和。 复杂度n3

B. 如图所示,A方法中曲线部分包括许多重复的区间, 可以通过保存前缀来降低一些复杂度, 得到n2算法。

  令B[i] = A[0]+A[1]+...A[I], 则B[j] - B[i] = A[i] +...+A[j],  也就是可以在O(1)时间内计算出子序列和。 

    此方法本质是:通过空间换时间省去计算过程。 但此方法也要枚举起点和终点,复杂度不会低于n2.

C. 考虑只枚举终点。对于点 j, 只需要找到满足 B[j]-B[i]>=S 最大的i值即可。问题变成了n轮查找(可使用二分,原数组全为整数,B序列一定递增)。

    继续挖掘, 发现随着 j 递增, i值一定是递增的。 最终可将解法优化到n。

   

转载于:https://www.cnblogs.com/tsubasa/archive/2013/03/22/2976404.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值