题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
(用c++实现)
这是一道经典的斐波那契数列问题。设 dp[i]
表示跳上第 i
级台阶的跳法总数,因为每次只能跳 1 级或 2 级,因此 dp[i] = dp[i-1] + dp[i-2]
。边界条件为 dp[0]=dp[1]=1
(跳到第 0 级或第 1 级只有一种跳法)。
根据题目要求需要对最终结果取模 1e9+7(1000000007)。在计算过程中也需要对中间结果进行取模,以避免数据溢出,这可以在每次计算 dp[i]
时取模。
下面是用 C++ 实现该算法的代码:
class Solution {
public:
int numWays(int n) {
// 对结果取模的值
const int mod = 1e9 + 7;
// 初始状态,注意 dp[0] 和 dp[1] 都等于 1,表示跳到第 0 级和第 1 级的方法数均为 1
int dp[2] = {1, 1};
// 从第 2 级开始依次计算跳上每一级台阶的总方法数
for (int i = 2; i <= n; i++) {
int temp = dp[1]; // 在计算 dp[i] 之前用临时变量存储 dp[i-1] 的值
dp[1] = (dp[0] + dp[1]) % mod; // dp[i] = dp[i-1] + dp[i-2],取模避免数据溢出
dp[0] = temp; // 更新 dp[i-1],继续计算下一个状态
}
return dp[1]; // 返回跳上第 n 级台阶的总方法数
}
};
注释解释如下:
const int mod = 1e9 + 7;
:定义一个mod
常量,表示对结果需取模的值。由于题目中给出的数非常大,所以要对结果取模,避免数据溢出。int dp[2] = {1, 1};
:定义一个长度为 2 的数组dp
,用于存储跳上某个台阶的总方法数,dp[0]
和dp[1]
初值均为 1,表示跳到第 0 级和第 1 级的方法数均为 1。for (int i = 2; i <= n; i++) {...}
:从第 2 级台阶开始,依次计算跳上每一级台阶的总方法数,循环变量i
初始值为 2,终止值为 n。int temp = dp[1];
:用临时变量temp
存储dp[i-1]
的值,以便计算dp[i]
。dp[1] = (dp[0] + dp[1]) % mod;
:根据斐波那契数列的递推公式dp[i] = dp[i-1] + dp[i-2]
,计算跳上第 i 级台阶的总方法数dp[i]
,并将结果取模,赋值给dp[1]
。dp[0] = temp;
:更新dp[i-1]
的值,为计算下一个状态做准备。return dp[1];
:返回跳上第 n 级台阶的总方法数,即dp[n]
。
希望以上注释能够帮助您更好地理解代码实现的具体细节。