剑指 Offer 10- II. 青蛙跳台阶问题

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 10- II. 青蛙跳台阶问题相关的知识,希望对你有一定的参考价值。

青蛙跳台阶问题


题目链接: 青蛙跳台阶问题

有关题目

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

答案需要取模 1e9+71000000007),如计算初始结果为:1000000008,请返回 1
示例 1:

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

输入:n = 7
输出:21
示例 3:

输入:n = 0
输出:1
提示:

0 <= n <= 100

题解

1、递归

class Solution {
public:
    int numWays(int n) {
        if (n == 0 || n == 1)
            return 1;
        else
            return (numWays(n - 1) + numWays(n - 2)) % 1000000007;
    }
};

多次重复计算一些值,例如:numWay(n - 2)、num(n - 3)、等等所以到n = 43就超时了。而下面的两种方法就没这重复计算的步骤。
在这里插入图片描述
2、哈希表
参考链接:坚持

class Solution {
public:
    unordered_map<int,int> mp;
    int dfs(int n)
    {
        if (n == 1 || n == 0)
            return 1;
        else if (mp.count(n))检查,这个n是不是之前就算过,如果算过直接返回,
            return mp[n];

        int a = dfs(n - 1) % 1000000007;//这步和下面一步都在回调函数,算出所需要的值
            mp[n - 1] = a;
        int b = dfs(n - 2) % 1000000007;
            mp[n - 2] = b;
        mp[n] = (a + b) % 1000000007;
        return mp[n] ;
    }
    int numWays(int n) {
      return dfs(n);
    }
};

在这里插入图片描述

3、记忆化递归法(迭代方法)
参考链接:Krahets

代码一:


class Solution {
public:
    int numWays(int n) {
        if (n < 2)
            return 1;//这边
        vector<int> dp(n + 1);
        dp[0] = 1,dp[1] = 1;
        for (int i = 1; i < n; i++)
        {
            dp[i + 1] = (dp[i] + dp [i - 1]) % 1000000007;
        }
         return dp[n] ;
    }
};
class Solution {
public:
    int numWays(int n) {
       vector<int> dp;//这边为啥加上(n + 1,0),就跑不过去了???
       for (int i = 0; i <= n; i++)
        {
            if (i == 1 || i == 0)
                dp.push_back(1);
            else
                dp.push_back((dp[i - 1] + dp[i - 2]) % 1000000007 );
        }
        return dp[n];
    }
};

时间复杂度:O(n)
空间复杂度:O(n)
在这里插入图片描述

4、动态规划

int numWays(int n){
    if (n < 2)
            return 1;//这边在C++版本有可能跑不过去
        int first = 1,second = 1;
        for (int i = 2; i <= n; i++)
        {
            int tmp = second;
            second = (first + second) % 1000000007;
            first = tmp;
        }
        return second;
}

时间复杂度:O(n)
空间复杂度:O(1)
在这里插入图片描述

以上是关于剑指 Offer 10- II. 青蛙跳台阶问题的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer:面试题10-II.青蛙跳台阶问题

剑指Offer面试题10- II. 青蛙跳台阶问题

剑指 Offer 10- II. 青蛙跳台阶问题

算法剑指 Offer 10- II. 青蛙跳台阶问题

算法剑指 Offer 10- II. 青蛙跳台阶问题

算法剑指 Offer 10- II. 青蛙跳台阶问题