【发布时间】:2021-03-24 22:45:28
【问题描述】:
几天前我在做一个在线面试,遇到了这个任务,我们可以通过仅使用步骤 1 或 2 或 3 来达到第 n 步。
更新问题: 一个孩子正在跑上 n 个台阶的楼梯,一次可以跳 1 个台阶、2 个台阶或 3 个台阶。实现一种方法来计算孩子可以用多少种可能的方式跑上楼梯。
这是我使用动态编程的解决方案。但是在面试的过程中,我看到有 6 个隐藏的测试用例失败了。
public static long countWays(int n)
{
if(n==0 || n==1) return 1;
long[] res = new long[n + 1];
res[0] = 1;
res[1] = 1;
res[2] = 2;
for (int i = 3; i <= n; i++)
res[i] = res[i - 1] + res[i - 2]
+ res[i - 3];
return res[n];
}
面试过程中,11个测试用例中只有5个通过,其余6个为隐藏测试用例。
n 的范围是 0 到 10 的 8 次方。
我无法理解我在哪里做错了,这段代码的时间复杂度已经是 O(n)。有没有更好的方法来做到这一点,还是我错过了什么?
【问题讨论】:
-
如果您在这里解释“步骤”的含义会更清楚。当您写“步骤 1 或 2 或 3”时,听起来您指的是您未描述的某些程序的某些步骤。此外,如果
n可能高达 10^8,那么您正在执行的算术运算的正确结果不可能适合long,因为序列呈指数增长。 -
@Pshemo,我在更新部分添加了详细信息,请检查。
-
另外,10^8 是一个非常大的数字,O(n) 算法对于大多数在线评委来说可能不够快。
-
@kaya3,我在更新部分添加了详细信息。程序的返回类型很长,所以我创建了我的数组类型为 long。
-
您不需要找到所有组合,只需找到它们的数量。正确的答案是计算答案,而不是穷尽找到所有组合。为此,您必须通过纯数学或通过在蛮力方法的输出中找到一个模式来解决一系列小的
n值。