【剑指offer】10.2. 青蛙跳台阶问题

147 阅读2分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 10.2. 青蛙跳台阶问题

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

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


// 牛客
// 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的
// 台阶总共有多少种跳法(先后次序不同算不同的结果)。

题解

// 实际上跟斐波那契数列是一个意思,青蛙要么跳1步,f(1)=1
// ,要么跳2步,f(2)=2
// 如果是台阶n阶,计算所有的跳法,
// 首先青蛙跳第一步的时候存在跳1阶和跳2阶两种情况
// 跳1阶,还剩下n-1阶,那么就是f(n-1)种跳法。
// 跳2阶,还剩下n-2阶,那么就是f(n-2)种跳法。
// 所有情况加起来,就是最终n阶台阶跳法,其实就是f(n)=f(n-1)+f(n-2)。
// 其实和斐波那契数列一样的算法。

// 牛客

// 暴力递归解,不可取
// 运行时间:317ms
// 占用内存:9584k
public class Solution {
    public int JumpFloor(int target) {
        if (target < 3) 
            return target;
        return JumpFloor(target - 1) + JumpFloor(target - 2);
    }
}


// 动态规划
// 运行时间:9ms
// 占用内存:9688k
public class Solution {
    public int JumpFloor(int target) {
        if (target < 3) 
            return target;
        int prev1 = 1, prev2 = 2;
        int f = 0;
        for (int i = 2; i < target; i++) {
            f = prev1 + prev2;
            prev1 = prev2;
            prev2 = f;
        }
        return f;
    }
}

// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.4 MB, 在所有 Java 提交中击败了61.21%的用户
class Solution {
    public int numWays(int n) {
        if (n == 0)
            return 1;
        if (n < 3)
            return n;
        int prev1 = 1, prev2 = 2;
        int f = 0;
        for (int i = 2; i < n; i++) {
            f = (prev1 + prev2) % 1000000007;  // 根据数值要求做修改
            prev1 = prev2;
            prev2 = f;
        }
        return f;
    }
}