前往此题

求和公式解法

根据等差数列求和公式,依据已知的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