目录

LC 829. 连续整数求和 (opens new window) (opens new window)

困难

# 问题描述

给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。

示例 1:

输入: n = 5
输出: 2
解释: 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。

示例 2:

输入: n = 9
输出: 3
解释: 9 = 4 + 5 = 2 + 3 + 4

示例 3:

输入: n = 15
输出: 4
解释: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5

提示:

  • 1 <= n <= 109

# 数学

假设存在某个连续的序列和为 nn,设首项为 aa,项数为 kk,根据 等差数列求和公式可得

(a+a+k1)×k2=n\frac {(a + a + k - 1) \times k}{2} = n

变形可得

(2a+k1)×k=2n2a=2nkk+1(2a + k - 1) \times k = 2n \Leftrightarrow 2a = \frac {2n}{k} - k + 1

因为首项跟项数都大于 00,因此有

2a=2nkk+122a = \frac {2n}{k} - k + 1 \geq 2

进一步可得

2nkk+12nk>k2n>k2\frac {2n}{k} \geq k + 1 \Rightarrow \frac {2n}{k} \gt k \Leftrightarrow 2n \gt k^2

即项数 kk 的取值范围为 [1,2n)[1, \sqrt {2n}) ,因为已经推导得出 2a=2nkk+12a = \frac {2n}{k} - k + 1,枚举此范围内的全部值 kk,即可得到 2a2a 的全部可能的值,由于首项必须是正整数,因此满足 2nkk+1mod2=0\frac {2n}{k} - k + 1 \; \text {mod} \; 2 = 0 即是合法的序列 [a,,a+k1][a, \dots , a + k - 1],统计合法序列个数即可。

/**
 * @param {number} n
 * @return {number}
 */
var consecutiveNumbersSum = function (n) {
  let ans = 0
  let m = n * 2
  for (let k = 1; k * k < m; k++) {
    // 不能整除直接跳过
    if (m % k != 0) continue
    if ((m / k - k + 1) % 2 === 0) ans++
  }
  return ans
}
  • 时间复杂度:O(2n)O(\sqrt {2n})
  • 空间复杂度:O(1)O(1)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!