连续段之和得到
n
n
n,那么可以找到一个长度为
k
k
k的连续段,其首项为
a
a
a,三者之间满足一些关系以构成答案。
具体来说,由等差数列求和公式得
(
a
+
a
+
k
−
1
)
×
k
2
=
n
\frac{(a+a+k-1)\times k}{2}=n
2(a+a+k−1)×k=n
变换可得,
2
a
=
2
n
k
−
k
+
1
≥
2
2a=\frac{2n}{k}-k+1\ge 2
2a=k2n−k+1≥2
也就是说,
2
n
k
≥
k
+
1
⇔
2
n
k
>
k
\frac{2n}{k}\ge k+1\Leftrightarrow \frac{2n}{k}\gt k
k2n≥k+1⇔k2n>k
即
k
k
k必然是
2
n
2n
2n的约数,且是较小的那一方,所以枚举
k
k
k并判断等差数列和即可。
Java
classSolution{publicintconsecutiveNumbersSum(int n){int res =0;
n *=2;for(int k =1; k * k < n; k++){if(n % k !=0)continue;if((n / k -(k -1))%2==0)
res++;}return res;}}
时间复杂度:
O
(
2
n
)
O(\sqrt{2n})
O(2n)
空间复杂度:
O
(
1
)
O(1)
O(1)
C++
class Solution{
public:
int consecutiveNumbersSum(int n){
int res =0;
n *=2;for(int k =1; k * k < n; k++){if(n % k !=0)continue;if((n / k -(k -1))%2==0)
res++;}return res;}};