找出将n表示为具有边界的两个整数之和的方法的数量

时间:2016-10-04 19:12:28

标签: java algorithm nested

我正在玩围棋,但我真的被卡住了 以下有效问题。

问题
给定整数n,l和r,找到将n表示为两个整数A和B之和的方式的数量,使得l≤A≤B≤r。

示例
对于n = 6,l = 2且r = 4,输出应为 countSumOfTwoRepresentations2(n,l,r)= 2。 只有两种方法可以将6写成A + B,其中2≤A≤B≤4:6 = 2 + 4和6 = 3 + 3.

这是我的代码。它通过了所有单元测试,但失败了 在隐藏的。有人能以某种方式指导我吗? 提前谢谢。

public static int countSumOfTwoRepresentations2(int n, int l, int r) {
    int nrOfWays = 0;
    for(int i=l;i<=r;i++)
    {
        for(int j=i;j<=r;j++)
        {
            if(i+j==n)
                nrOfWays++;
        }
    }
    return nrOfWays;

}

3 个答案:

答案 0 :(得分:5)

嗯,没有必要进行如此庞大的计算......这很容易计算:

public static int count(int n, int l, int r) {
    if (l > n/2)
        return 0;
    return Math.min(n/2 - l, r - n/2) + ((n%2 == 1) ? 0 : 1);
}

到目前为止通过我的所有测试。对于正面和负面。

答案 1 :(得分:1)

在Java中:

int countSumOfTwoRepresentations2(int n, int l, int r)
{
     return Math.max(0,Math.min(n/2-l,r-n/2)+(n+1)%2);
}

在Python3中:

def countSumOfTwoRepresentations2(n, l, r):
    return max(0,min(n//2-l,r-n//2)+(n+1)%2)

答案 2 :(得分:0)

int countSumOfTwoRepresentations(int n, int l, int r)
  {
    int r1 = 0;
    if (n > l + r || n < 2 * l)
        return 0;
    r1 = n - l;
    if ((r1 - l) % 2 == 0)
        return (r1 - l) / 2 + 1;
    else
        return (r1 - l + 1) / 2;
}