题目分析:[[EVD]] - 剑指 Offer 10- II. 青蛙跳台阶问题https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/
简单描述:
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法
限制🚫
- 0 <= n <= 100
- 取模 1e9+7(1000000007)
示例:
输入:n = 2
输出:2输入:n = 7
输出:21输入:n = 0
输出:1
解题思路:
思路:
- #动态规划DP
- dp[i]:第i台阶的方法数
- 状态分析
- dp[i-1]:第i-1台阶到第i阶有跳1格的1种方法
- dp[i-2]:第i-2台阶到第i阶有跳1格、2格两种方法(其中一种在dp[i-1]中已计算),因此也只有1种方法
- 状态转移方程
- dp[i] = dp[i-1] + dp[i-2];
- 结论:等价于[[EVD]] - 剑指 Offer 10- I. 斐波那契数列https://blog.csdn.net/qq_26897631/article/details/123802129,区别仅在于初始不同,斐波那契数列f(0)=0,而青蛙跳台阶f(0)=1
效率:
- 时间复杂度
- 空间复杂度
代码:
class Solution
{
private:
const int MOD = 1e9 + 7;
public:
int numWays(int n)
{
int a = 0, b = 1;
while (n--)
{
a = (a + b) % MOD;
swap(a, b);
}
return b; //青蛙跳台阶,初始f(0)=1
//return a; //斐波那契,初始f(0)=0
}
};