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

1,599 阅读1分钟

一、题目

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

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

样例1:

输入: n = 2
输出: 2

样例2:

输入: n = 7
输出: 21

样例3:

输入: n = 0
输出: 1

提示:

0 <= n <= 100

二、题解

这题看起来有点一头雾水,其实我觉得,这种看起来复杂的题目就先把问题简单化,比如题目问青蛙跳上一个 n 级的台阶总共有多少种跳法。那我们就想青蛙跳上一个0级台阶有几种跳法,显然是一种,因为都需要跳。那跳上一个1级台阶有几种呢,也是一种,因为只要往上跳1级就ok。那2级台阶呢?这里就有两种了,一种是跳两次1级,一种是跳一次2级,那么我们抽象想一下,跳上n级的最后一步有几种呢,两种,一种是在n-1级台阶跳1级,一种是在n-2级台阶跳两级,然后我继续求n-1级台阶和n-2级台阶有几种方法,递归下去!那么这是不是就是求递归了呢?且公式为f(n)=f(n-1)+f(n-2),所以这题其实内核就是斐波那契数列的运算,但是要注意的是!初始值不一样了!f(0)=1,f(1)=1。

所以具体解法就如前面写的斐波那契题解了。链接:juejin.cn/post/698720…

所以下面我就只写一下动态规划方法的代码练练手了

三、代码(js)

/**
 * @param {number} n
 * @return {number}
 */

// 类型于斐波那契,只不过初始数据不同

//动态规划
var numWays = function(n) {
  let dp = new Array(n+1);
  //跳上0层台阶就一种方法
  dp[0]=1;
  //跳上1层台阶也就一种方法
  dp[1]=1;
  for(let i = 2;i <= n ;i++)
  {
      dp[i] = dp[i-1] + dp[i-2]; 
      dp[i]%=1000000007;
  }
  return dp[n];
};

四、拓展思考

主要是要注意化抽象为具体的思考模式,其他没有啥好说的了。

题目来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/qi…