青训营刷题-有点限制地走楼梯题解

94 阅读2分钟
题目链接直达www.marscode.cn/landing?uid…

问题描述

  • 有个楼梯比较高,我们有多种方式可以走上去,但是在走楼梯时有几个限制:

    • 一是每次可以走一或者两步
    • 二是不能连续地走两步

    那么我们需要计算总共有多少种可能的走法

输入

楼梯的层数,层数n(0 < n < 100)

输出

总共有多少种走法

输入样例

2

思路

递归或者dp都行
  1. 基本情况:

    • 如果楼梯只有1层 (n=1),那么只有1种走法。
    • 如果楼梯有2层 (n=2),那么有2种走法:1+1 或 2。
  2. 递归情况:

    • 对于大于2层的楼梯,到达第 n 层的方法数等于到达第 n-1 层的方法数加上到达第 n-2 层的方法数。这是因为从第 n-1 层只能走1步到第 n 层,而从第 n-2 层也只能走1步到第 n 层(不能连续走两步)。
    代码实现
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);
    }
}
优化(记忆化的递归)
  1. 性能问题: 这种递归方法在 n 较大时会导致大量的重复计算,因此效率较低。例如,计算 solution(5) 时,solution(3) 会被计算两次,这会导致指数级别的计算量。
  2. 优化建议: 如果需要处理较大的 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);
    }
}