最短子序列和问题

有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。

   

posted @ 2013-03-22 22:08  tsubasa_wp  阅读(1210)  评论(0编辑  收藏  举报