【问题标题】:Java Calculate Max Steps of Stairs and skip stairJava计算楼梯的最大步数并跳过楼梯
【发布时间】:2017-02-18 13:59:59
【问题描述】:

我最近得到了一个实习职位的面试,其中一个问题与此类似:

输入:n 代表动作的数量,k 代表你不能踏上的楼梯 开

问题:杰克有 n 数量的行动,他想达到 最大步数,但不能踏上第 k 个楼梯。对于每个 行动,杰克可以留在他当前的一步或跳 i 步,如果他 正在执行他的第 i 个动作,并且一直持续到他完成第 n 个动作 行动。

输出:他在n个动作内可以到达的最大楼梯

它是通过 Hackerrank 测试的(面试官在那里),我只通过了 8 个测试用例中的 3 个,其余的超时

这是我动态编码的解决方案,我无法对其进行优化,想知道是否有更优化的解决方案:

static int maxStep(int n, int k) {
    int result = 0;
    if (n == 0) {
        return result;
    } 
    return maxStepHelper(n,0, k, result);
}

static int maxStepHelper(int n,int i,int k,int result) {
    // At n+1 steps, previous steps' results are recorded and this is mainly used to stop and show previous results
    if (i == n+1) {
        return result;
    }
    int nextStep = i + result;
    if (nextStep == k) {
       return maxStepHelper(n,i+1,k,result);
    } 
    return Math.max(maxStepHelper(n,i+1,k,result),maxStepHelper(n,i+1,k,result+i));
}

请注意,我使用了一种可能没有帮助的递归方法

【问题讨论】:

  • i 步跳i 步,还是跳 i 步?你从哪一步开始(大概不是零)。
  • 你似乎只是在移动i+1。说明说你可以向上移动i 任何楼梯i 的台阶@
  • 对不起,我没说清楚:从第 i 步跳 i 步,你从 0 开始
  • 如果你可以从i 迈出i 的步骤,并且从i==0 开始,你怎么能迈出任何步骤?
  • 哦,我的意思是行动,让我改变一下,抱歉已经有一段时间了

标签: java algorithm recursion dynamic-programming


【解决方案1】:

这里不需要递归或动态编程;这只是一点数学。

如果您每回合走i 步,您将走(n * (n+1)) / 2 步。如果k 是方程的整数解,您将进入k-th 步:

k = (n * (n+1)) / 2

重新排列:

0 = n^2 + n - 2*k

这是n中的二次方程:

n = (-1 +/- sqrt(1 + 4*1*2*k)) / 2

只有当sqrt(1 + 8*k) 是奇数时才有整数解。

所以:

  • 如果sqrt(1 + 8*k) 是一个奇数,您将进入k-th 步。所以,第一个动作就不要迈出一步,你会错过k 1。最大步数是(n * (n+1)) / 2 - 1

    这是您想错过的第一个操作,因为 1 是您可以缩短的最小步数。如果您错过了第二个动作,您将比最大值短 2 步等。

  • 否则,每个动作只走i步,最大步数为(n * (n+1)) / 2

【讨论】:

  • 这就是我想到的答案,只是一个问题,如何检查sqrt(1+8k) 是否为整数?对于小数,这个问题可以很容易地解决,但对于非常大的数,不完整的浮点数学就成了一个问题
  • 如果你特别关心大数字,你总是可以在 for 循环中对 1+2+3+...+n 求和,如果它等于 k,则将总和减 1。或者使用some well-known algorithm计算整数平方根。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2020-08-03
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多