LeetCode-面试题10.2-青蛙跳台阶问题

来源:力扣(LeetCode)面试题10.2

问题

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

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

输入:n = 7
输出:21

解答

青蛙每次跳台阶的情况有两种:

①跳2级台阶

②跳1级台阶

排列组合解法

分析

假设情况①共出现 x(x >= 0,x <= n/2) 次,则还剩下 n - 2x 级台阶给情况②。那么,青蛙一共跳了 y = x + n - 2x = n - x 次。

那么,问题就转化为:将 x 个完全相同的球放入 y 个有次序的盒子,共有多少种情况?

计算公式为:

times = y*(y-1)*(y-2)*...*(y-x+1)/(1*2*3*....*x)

据此,将 x0n/2 的所有times值累加,即得出结果。

代码

public int numWays(int n) {
    int res = 0;
    for(int x = 0; x <= n/2; x++){
        int y = n - x;
        int upper = 1;
        int lower = 1;
        for(int i = 1; i <= x; i++){
            upper *= (y - i + 1);
            upper %= 1000000007;
            lower *= i;
            lower %= 1000000007;
        }
        res += upper/lower;
    }
    return res;
}

问题

理论上,这个方法可以计算出结果。

但,经过测试,当 x > 23 时,结果出现错误。

由于 先进行乘法,再进行取模,无法避免 进行乘法时结果溢出的情况。

暂时未找到解决办法。

波菲纳契数列解法

分析

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

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

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

  • 综上,f(n) = f(n - 1) + f(n - 2)

  • 当只有0或1级台阶,青蛙只需要跳1下,即 f(0) = f(1) = 1

代码

参考LeetCode-面试题10.1-斐波那契数列

posted @ 2020-07-11 11:10  henuajy  阅读(171)  评论(0编辑  收藏  举报