当前位置:网站首页>Leetcode 829. 连续整数求和

Leetcode 829. 连续整数求和

2022-06-10 13:17:00 joseri

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)(rl+1)/2
我们将其参数转化。令r'=r+1/2l'=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' 就都是整数,不要忘了我们还要反代回lr 要加减1/2,所以不满足lr 都是整数的题干。舍弃掉

  • 当a和b奇偶性不同时,r'l'都是1/2+c(c代指常整数),反代回lr 就都是整数了,满足题意。

分析之后,一句话来概括,我们要找的就是两个数乘积等于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;
    }
};

十分钟解决一道困难题多是一件美事啊!

原网站

版权声明
本文为[joseri]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_45579784/article/details/125110732