数据结构与算法-跳台阶
题目链接
题目描述
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:\(1 \leq n \leq 40\)
要求:时间复杂度:\(O(n)\) ,空间复杂度: \(O(1)\)
问题分析
设 \(f(n)\) 表示青蛙跳上 \(n\) 级台阶的跳法数。当只有一个台阶时,即 \(n = 1\) 时,只有 1 种跳法;
当 \(n = 2\) 时,有 \(2\) 种跳法; 当 \(n = 3\) 时,有 \(3\) 种跳法;
当 \(n\) 很大时,青蛙在最后一步跳到第 \(n\) 级台阶时,有两种情况:
- 青蛙在第 \(n-1\) 个台阶跳一个台阶,那么青蛙完成前面 \(n-1\)个台阶,就有 \(f(n-1)\) 种跳法,这是一个子问题。
- 青蛙在第 \(n-2\) 个台阶跳两个台阶到第 \(n\) 个台阶,那么青蛙完成前面 \(n-2\) 个台阶,就有 \(f(n-2)\) 种情况,这又是另外一个子问题。
两个子问题构成了最终问题的解,所以当 \(n \ge 3\)时,青蛙就有 \(f(n)=f(n-1)+f(n-2)\) 种跳法。
上面的分析过程,其实我们用到了动态规划的方法,找到了状态转移方程,用数学方程表达如下:
\[f(n) = \begin{cases}
1& \text{ if } n=1 \\
2& \text{ if } n=2 \\
f(n-1)+f(n-2)& \text{ if } n \ge 3
\end{cases}
\]
上面的公式熟不熟悉,是不是跟斐波那契数列长得非常像。实现请参照 斐波那契数列 。