Leetcode 829. 连续整数求和

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/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' 就都是整数,不要忘了我们还要反代回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;
    }
};

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值