我是新来的,如果我的问题不相关,请删除它。在解决LeetCode上的以下问题时,我有一个疑问:
70-爬楼梯: 您正在爬楼梯。需要N步才能到达顶部。 每次您可以爬1或2步。您可以通过几种不同的方式攀登顶端?
注意:给定n将是一个正整数。
示例1:
说明:有两种爬上顶部的方法。
一步然后另一步
一次两个步骤。
我知道此问题的两种解决方案:
一个在每一步中计算所有可能的步长组合的人:
public class Solution {
public int climbStairs(int n) {
climb_Stairs(0, n);
}
public int climb_Stairs(int i, int n) {
if (i > n) {
return 0;
}
if (i == n) {
return 1;
}
return climb_Stairs(i + 1, n) + climb_Stairs(i + 2, n);
}
}
和另一个使用动态编程的人:
public class Solution {
public int climbStairs(int n) {
if (n == 1) {
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
很明显,第二个要比第一个更有效。但是,当我提交它们时,LeetCode显示的运行时间几乎相同,大约为4ms。第二个运行时间是否应该比第一个运行时间短得多?
答案 0 :(得分:0)
我用不同的步数测试了您的实现。代码位于答案的结尾。
对于{strong> 3 个步骤,n = 3
,我得到了以下输出:
Time spent for 3 step(s):
- climbStairsByComputingAllNextSteps(): 6243 nanoseconds
- climbStairsDynamically(): 25236 nanoseconds
哦,效率越高,速度越慢?好吧,让我们再做一个测试:
对于{strong> 20 个步骤,n = 20
,我得到了以下输出:
Time spent for 20 step(s):
- climbStairsByComputingAllNextSteps(): 1048360 nanoseconds
- climbStairsDynamically(): 5657 nanoseconds
因此,实现的效率取决于 n
。
当然,您的算法的 time complexity 对效率有很大的影响(很抱歉,如果与字词)。但是,对于两种给定的算法,一种可能对 n < nmax value
而言更高有效,然后对于 { {1}} 。
看看这张摘自Wikipedia的图表(作者:Cmglee-许可证CC BY-SA 4.0,摘自上面链接的文章):
n >= nmax
nlog
2
的曲线似乎比 n
,一个,,除了0附近的 n
。这个社区可能会有所不同。在这里,他们的效率切换点似乎是 (0 <= n < ~1)
。
在我使用的工作示例下面(尝试Online Java Compiler)。
n=6