Leetcode 829. 连续整数求和
原题链接:https://leetcode.cn/problems/consecutive-numbers-sum/
难度等级:困难
感觉这题算不上一个困难题,思路想清楚之后代码也比较短。
首先我们考虑从l+(l+1)+...+r
这个过程,如果用S来代表他们的和,那么
S
=
(
l
+
r
)
∗
(
r
−
l
+
1
)
/
2
S = (l+r)*(r-l+1)/2
S=(l+r)∗(r−l+1)/2
我们将其参数转化。令r'=r+1/2
l'=l-1/2
,就可以得(l'+r')*(r'-l')=2*S
,也就转化成了平方和公式,我们便将原问题转化为了如何将2*S
这个数分解成两个因数。
下面考察两个因数a和b的奇偶性:
-
当a和b奇偶性相同时,我们把a和b分别带进参数方程中,a*b = 2 * S
有 l'+r' = a && r'-l'= b => r' = (a+b)*1.0/2, l'= (a-b)*1.0/2
如果a和b奇偶性相同,a+b和a-b都是偶数,那么
r'
和l'
就都是整数,不要忘了我们还要反代回l
和r
要加减1/2
,所以不满足l
和r
都是整数的题干。舍弃掉 -
当a和b奇偶性不同时,
r'
和l'
都是1/2+c(c代指常整数),反代回l
和r
就都是整数了,满足题意。
分析之后,一句话来概括,我们要找的就是两个数乘积等于2*n且两个数的奇偶性相同的组数。
直接上代码
class Solution {
public:
int consecutiveNumbersSum(int n) {
int cnt = 0;
int tn = 2 * n;
for(int i = 1; i < tn/i; i++) {
if(tn%i==0) {
int a = tn / i, b = i;
if((a&1)==(b&1)) continue;
else cnt++;
}
}
return cnt;
}
};
十分钟解决一道困难题多是一件美事啊!