问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n
级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
解题思路
这个问题可以使用动态规划来解决,其中状态转移方程表示为:F(n) = F(n-1) + F(n-2),其中 F(n) 表示跳上 n 级台阶的跳法总数。
n=1:(1)
n=2:(1,1),(2)
n=3:(1,1,1),(2,1),(1,2)
....................................
多写出几个例子可以发现F(n)=F(n-1)+F(n-2)
这个问题可以使用动态规划来解决,其中状态转移方程表示为:F(n) = F(n-1) + F(n-2),其中 F(n) 表示跳上 n 级台阶的跳法总数。
以下是解题的思路、时间和空间复杂度以及对应的 C++ 代码:
思路:
- 创建一个数组
dp
,其中dp[i]
表示跳上第i
级台阶的跳法总数。 - 初始化
dp[0] = 1
和dp[1] = 1
,因为跳上 0 级和 1 级台阶只有一种跳法。 - 使用循环从 2 开始遍历到
n
,根据状态转移方程F(n) = F(n-1) + F(n-2)
计算dp[i]
。 - 返回
dp[n]
,即跳上n
级台阶的跳法总数。
**时间复杂度:**遍历一次台阶数 n
,因此时间复杂度为 O(n)。
**空间复杂度:**创建一个大小为 n+1
的数组 dp
,因此空间复杂度为 O(n+1)。
代码及结果
int Solution::numWays(int n)
{
const int MOD = 1000000007;
if (n <= 1) {
return 1;
}
std::vector<int> dp(n + 1);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
dp[i] = (dp[i - 1] + dp[i - 2]) % MOD;
}
return dp[n];
}