【发布时间】: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