题目链接直达:www.marscode.cn/landing?uid…
问题描述
-
有个楼梯比较高,我们有多种方式可以走上去,但是在走楼梯时有几个限制:
- 一是每次可以走一或者两步
- 二是不能连续地走两步
那么我们需要计算总共有多少种可能的走法
输入
楼梯的层数,层数n(0 < n < 100)
输出
总共有多少种走法
输入样例
2
思路
递归或者dp都行
-
基本情况:
- 如果楼梯只有1层 (
n=1),那么只有1种走法。 - 如果楼梯有2层 (
n=2),那么有2种走法:1+1 或 2。
- 如果楼梯只有1层 (
-
递归情况:
- 对于大于2层的楼梯,到达第
n层的方法数等于到达第n-1层的方法数加上到达第n-2层的方法数。这是因为从第n-1层只能走1步到第n层,而从第n-2层也只能走1步到第n层(不能连续走两步)。
代码实现
- 对于大于2层的楼梯,到达第
public class Main {
public static int solution(int n) {
// Edit your code here
if(n == 1)return 1;
if(n == 2)return 2;
return solution(n - 1) + solution(n - 2);
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(solution(2) == 2);
}
}
优化(记忆化的递归)
- 性能问题: 这种递归方法在
n较大时会导致大量的重复计算,因此效率较低。例如,计算solution(5)时,solution(3)会被计算两次,这会导致指数级别的计算量。 - 优化建议: 如果需要处理较大的
n值,建议使用记忆化的递归或动态规划方法来避免重复计算。
public class Main {
public static int solution(int n) {
int[] memo = new int[n + 1];
return helper(n, memo);
}
private static int helper(int n, int[] memo) {
if (n == 1) return 1;
if (n == 2) return 2;
if (memo[n] != 0) {
return memo[n];
}
memo[n] = helper(n - 1, memo) + helper(n - 2, memo);
return memo[n];
}
public static void main(String[] args) {
System.out.println(solution(2) == 2);
}
}