最短子序列和问题
有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。