谈谈跳台阶问题

597 阅读1分钟

1、一次可以跳一个台阶或者两个台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。

示例 1:

输入:n = 2
输出:2
示例 2:

输入:n = 7
输出:21
提示:

0 <= n <= 100

设跳上 n 级台阶有 f(n) 种跳法。在所有跳法中,青蛙的最后一步只有两种情况:跳上 1 级或 2 级台阶。

  1. 当为 1 级台阶: 剩 n-1个台阶,此情况共有 f(n−1) 种跳法;
  2. 当为 2 级台阶: 剩 n-2个台阶,此情况共有 f(n−2) 种跳法。

f(n) 为以上两种情况之和,即 f(n)=f(n-1)+f(n-2)

class Solution {
    public int numWays(int n) {
        if (n == 0)
            return 1;
        if (n <= 2)
            return n;
        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];
    }
}

2.一次可以跳一个台阶、两个台阶或者三个台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,还可以跳上3级台阶。
求该青蛙跳上一个 n级的台阶总共有多少种跳法。

最后一步可能是从第n-1阶往上走1阶、从n-2阶往上走2阶,或从第n-3阶往上走3阶。因此,抵达最后一阶的走法,其实就是抵达这最后三阶的方式的总和。

class Solution {
    public static int numWays(int n) {
        if (n == 0)
            return 1;
        if (n == 2)
            return 2;
        if (n == 3)
            return 4;
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;
        for (int i = 4; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
        }
        return dp[n];
    }
    
}