zoukankan      html  css  js  c++  java
  • 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-斐波那契数列

  • 相关阅读:
    C++异常:exception
    C++关键字:explicit
    C++关键字:重学记录
    Unity jointmoto
    hashtable和hashmap
    Spring MVC 笔记 概述
    SQL上门2
    面试:A
    Java 初学者
    SQL上门
  • 原文地址:https://www.cnblogs.com/HenuAJY/p/13282845.html
Copyright © 2011-2022 走看看