一、 题目
1. 题目描述
给定一个正整数 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
Related Topics
- 数学
- 枚举
- 👍 177
- 👎 0
2. 原题链接
链接: 829. 连续整数求和
二、 解题报告
1. 思路分析
- 一开始没思路,想看题解发现有人推荐先做 2177. 找到和为给定整数的三个连续整数,这题简单啊,秒了之后感觉原题有点思路了,想了半天还是不会。
- 抄题解,把n分成k个连续整数之和,那么讨论k:
- 如果 k 是奇数,则当 n 可以被 k 整除时,正整数 n 可以表示成 k 个连续正整数之和
- 如果 k 是偶数,则当 n 不可以被 k 整除且 2n 可以被 k 整除时,正整数 n 可以表示成 k 个连续正整数之和。
2. 复杂度分析
最坏时间复杂度O( n \sqrt{n} n)
3. 代码实现
数学
。
class Solution:
def consecutiveNumbersSum(self, n: int) -> int:
dp=[0,1,1,2,1]
if n < 4:
return dp[n]
k = 1
ans = 0
n2 = n*2
while k*(k+1) <= n2:
if k&1:
ans += n%k==0
else:
ans += n%k!=0 and n2 %k ==0
k += 1
return ans
三、 本题小结
- 我是菜逼。