找到楼梯的最大步数

时间:2016-09-25 18:54:16

标签: java algorithm math data-structures

我正在解决楼梯问题并提出了多种解决方案。它看起来如下:

问题:您将获得N楼梯的数量。您可以采取的最大步骤是什么? 对于N = 5,您可以进行的最大步骤是2,因为

  

5 = 1 + 2 + 2

类似于8,其中,8 = 1 + 2 + 3 + 2,最大步长为3
类似地,对于16,其16 = 1 + 2 + 3 + 4 + 5 + 1,最大步长为5 当下一个数字小于之前的数字时,系列将停止 显然,最大步骤是系列中的最大数量。

解决方案1:

  

我提出了一个简单的解决方案。它工作正常,但没有优化。   以下是以下代码:

public static long stairCase(long N) {
        long i = 1;
        long curr = N;
        while (i < N) {
            curr = curr - i;
            if (i >= curr) {
                return i;
            }
            i = i + 1;
        }
        return i;
    }

解决方案2:

  

然后我发现它的n(n + 1)/ 2.所以,如果我把n(n + 1)/ 2 =否。的   楼梯。我无法通过计算其根源和服用来获得解决方案   最高的根。我的代码如下所示,但它不起作用   对于N = 16和许多其他情况。

int b = 1;
    int var = (1) - (4 * -c);
    double temp1 = Math.sqrt(var);

    double root1 = (-b + temp1) / (2 * a);
    double root2 = (-b - temp1) / (2 * a);
    double root1Abs = Math.abs(root1);
    double root2Abs = Math.abs(root2);
    return (long) (root1Abs > root2Abs ? Math.floor(root1Abs) : Math
            .floor(root2Abs)); 

解决方案3:

  

我提出了另一个解决方案,但仍然不适用于N = 4   和许多其他情况。以下是我的代码:

 double answer = Math.sqrt(c * 2);
    return (long) (Math.floor(answer));

是否有人拥有优化的解决方案(最好是在恒定时间内),因为输入太大(长)。

2 个答案:

答案 0 :(得分:1)

m =楼梯数

n =结果

等式是

a <- sample(c("A", "B", "C", "D", NA), 20, replace = T)
recode(a, old = c("A", NA), new = c("E", "F"))

解决方案是

n * (n+1) < 2m

我们尝试找到最大整数

n < (sqrt(8*m+1)-1)/2

Java代码:

n = floor((sqrt(8*m+1)-1)/2)

答案 1 :(得分:0)

其实我自己想出解决方案..我应该使用2 * c

int a = 1;
        int b = 1;
        int var = (1) - (4 * -2 * c);
        double temp1 = Math.sqrt(var);

        double root1 = (-b + temp1) / (2 * a);
        double root2 = (-b - temp1) / (2 * a);
        return (long) (root1 > root2 ? Math.floor(root1) : Math.floor(root2));