求和公式解法
根据等差数列求和公式,依据已知的target
我们可以计算出数列的范围(i,j)
。
根据求和公式:
$$
Sn=(a1+an)n/2
$$
代入我们求的范围(i,j)
:
$$
target = \frac{(i + j) \times (j - i + 1)}{2}
$$
现在我们已知target
需要求j
, 公式可以这样推导:
$$
target = \frac{ij - i^2 + i + j^2 - ij + j}{2}
$$
$$
target = \frac{j^2 + j - i^2 + i}{2}
$$
$$
2 \times target - (j^2 + j - i^2 + i) = 0
$$
整理一下:
$$
j^2 + j - (2 \times target + i^2 - i) = 0
$$
这个就是典型的一元二次方程嘛,我们求个根:
$$
j = \frac{-1\pm\sqrt{1+4(2\times target + i^2 - i)}}{2}
$$
由于j > i,去掉负数解,最后求j
的公式为
$$
j = \frac{-1+\sqrt{1+4(2\times target + i^2 - i)}}{2}
$$
有了这个公式,我们可以直接放入到代码中:
代码
class Solution:
def findContinuousSequence(self, target: int):
i, j, res = 1, 2, []
while i < j:
j = (-1 + (1 + 4 * (2 * target + i * i - i)) ** 0.5) / 2
if j == int(j):
res.append(list(range(i, int(j) + 1)))
i += 1
return res