一、题目
一只青蛙一次可以跳上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…