#力扣 LeetCode829. 连续整数求和 @FDDLC

题目描述:

829. 连续整数求和 - 力扣(LeetCode) (leetcode-cn.com)

 

Java代码一:

class Solution {
    public int consecutiveNumbersSum(int N) { //1 <= N <= 10 ^ 9,连续个数>=1;试求有多少组连续正整数满足所有数字之和为 N
        int answer=0;
        for(int amount=1,N2=N*2;(amount+1)*amount<=N2;amount++){
            if(N2%amount==0&&amount%2+N2/amount%2==1)answer++;
        }
        return answer;
    }
}

#力扣 LeetCode829. 连续整数求和 @FDDLC

 

Java代码二:

class Solution {
    public int consecutiveNumbersSum(int N) { //1 <= N <= 10 ^ 9,连续个数>=1;试求有多少组连续正整数满足所有数字之和为 N
        int answer=0;
        for(int amount=1;N>0;N-=amount++)
            if(N%amount==0)
                answer++;
        return answer;
    }
}

#力扣 LeetCode829. 连续整数求和 @FDDLC

解释:

1、以N=9为例

1)连续个数amount=1,9能平均分给这1个数,answer++;接下来要考察连续个数为2的情况,即a、a+1这样的情况,怎么才能保证平均数为a?把和减1即可,于是N=9-1=8,只需考察是否存在a、a(第2个数不是a+1了哦)的情况

2)连续个数amount=2,8能平均分给a、a这两个数,于是answer++;接下来要考察连续个数为3的情况,即a-1,a,a的情况(注意:后2个数的差距已经消除了),要消除这3个数的差距,只需让后2个数同时减1即可。于是和变成N=8-2=6,3个数变成a-1,a-1,a-1,只需考察6是否能平均分给这3个数即可

3)连续个数amount=3,6能平均分成3份,于是answer++;接下来要考察连续个数为4的情况,即a-2,a-1,a-1,a-1(注意:后3个数的差距已经消除了),要消除这4个数的差距,只需让后3个数同时减1即可。于是和变成N=6-3=3,4个数变成a-2,a-2,a-2,a-2,只需考察3能否平均分给这4个数即可。

其实到这就可以结束了(无需到N<=0)。因为此时N<amount,要满足每份为整数,则只有N=0,此时每个数分到0(即最小的数为0),又因为最小数>=1,所以不行。

于是代码可以改进,如下:

class Solution {
    public int consecutiveNumbersSum(int N) { //1 <= N <= 10 ^ 9,连续个数>=1;试求有多少组连续正整数满足所有数字之和为 N
        int answer=0;
        for(int amount=1;N>=amount;N-=amount++) //把N>0改成了N>=amount
            if(N%amount==0)
                answer++;
        return answer;
    }
}

 

上一篇:SQL(and ? ,?)


下一篇:动态规划解决零钱兑换问题