【力扣每日一题】829. 连续整数求和

题目描述

给定一个正整数 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 <= 10^9

这道题分析下来就是分奇偶性讨论:一个数模偶数的结果必须是偶数的一半,比如18%4=2,也就是18/4=4.5,这样相当于平分,那么18可以表示成3,4,5,6四个数的和;一个数模奇数的结果必须是0,即必须能整除,比如15%5=3,那么15可以表示成1,2,3,4,5的五个数的和。为了加快效率,我们可以做一些判断,当模的结果大于模数的一半时,不可能找到一组连续的正整数使条件成立,比如15%6=3,照理应该是0,1,2,3,4,5六个数之和,但0不能包括在内,所以直接结束当前循环。

class Solution {
    public int consecutiveNumbersSum(int n) {
        int ans = 0;
        int i = 1;
        while(true){
            if((double)n/i-(double)i/2<0)break;            
            if(i%2==1 && n%i==0)ans++;
            if(i%2==0 && n%i==i/2)ans++;
            i++;
        }
        return ans;
    }
}

当然我这样做还是有些复杂,大佬们已经用数学搞出了简单效率又高的代码。

class Solution {
    public int consecutiveNumbersSum(int n) {
        int ans = 0; n *= 2;
        for (int k = 1; k * k < n; k++) {
            if (n % k != 0) continue;
            if ((n / k - (k - 1)) % 2 == 0) ans++;
        }
        return ans;
    }
}

今天总算自己做出一道困难(简单)题了,继续努力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值