从 1-N 连续数列里取最少的数组成 K

137 阅读1分钟

前段时间在某交流群里看到一道题,分享一下

题目: 从 1-N 连续数列里取最少的数组成 K

解法一

从后往前遍历数列,累积求和,当累计值 S>=K,一定找到了最少的数

这样时间复杂度是O(N)

显然没有完全使用题目的特征信息

解法二

1-N 连续数列,可以想到等差数列

从N开始一段长度为 TT 的和可以表示为

S(T)=[(NT)+N](T+1)2 S(T)=\frac{[(N-T)+N](T+1)}{2}

有不等式

S(T)>=K S(T)>= K

解出来

T>=(2N+1)(2N+1)28K2 T >= \frac{(2N+1) - \sqrt{ (2N+1)^2 - 8K }}{2}

向上取整就是结果

如果不考虑开根号的开销的话,可以近似看作 O(1)O(1)