题目地址:
https://leetcode.com/problems/consecutive-numbers-sum/
给定一个正整数 n n n,问其被分解为若干连续正整数之和的方案数。
设 n = x + ( x + 1 ) + . . . + ( x + k − 1 ) n=x+(x+1)+...+(x+k-1) n=x+(x+1)+...+(x+k−1),那么 n = ( 2 x + k − 1 ) k 2 k x = n − k ( k − 1 ) 2 n=\frac{(2x+k-1)k}{2}\\kx=n-\frac{k(k-1)}{2} n=2(2x+k−1)kkx=n−2k(k−1)因为 x x x和 k k k都是正整数,所以 n − k ( k − 1 ) 2 ≥ k ⇒ k 2 + k ≤ 2 n n-\frac{k(k-1)}{2}\ge k\Rightarrow k^2+k\le 2n n−2k(k−1)≥k⇒k2+k≤2n可以枚举 k k k,如果 k ∣ n − k ( k − 1 ) 2 k|n-\frac{k(k-1)}{2} k∣n−2k(k−1)则说明能解出 x x x,方案数加 1 1 1。代码如下:
public class Solution {
public int consecutiveNumbersSum(int n) {
int res = 0;
for (int i = 1; i * i + i <= 2 * n; i++) {
if ((n - i * (i - 1) / 2) % i == 0) {
res++;
}
}
return res;
}
}
时间复杂度 O ( n ) O(\sqrt n) O(n),空间 O ( 1 ) O(1) O(1)。