剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n
级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
1 | 输入:n = 2 |
示例 2:
1 | 输入:n = 7 |
示例 3:
1 | 输入:n = 0 |
提示:
0 <= n <= 100
解题思路
这道题是一道很经典的动态规划的题。
基本思路就是用动态数组中的元素dp[i]
表示跳到i
级台阶共有多少种跳法。那么我们可以很容易得到状态转移方程:
1 | dp[i] = dp[i-1] + dp[i-2] //因为一次只能跳一阶或者两阶台阶 |
然后边界条件就是跳到0
级台阶的情况:
1 | dp[0] = 1 |
然后照此思想编程就可以了。
但是这里有一个问题需要注意,在台阶数很大的情况下,用int、long、long long
可能都会溢出,由于输出的时候需要取模,所以我们可以用下述公式避免数据溢出的问题:
1 | (a + b) % c = (a % c + b % c ) % c |
示例代码
1 | int numWays(int n){ |
然后发现这里用一个数组去存储中间结果有些浪费空间,我们只需要用两个数来存储dp[i - 1] % 1000000007
和dp[i - 2] % 1000000007
就可以了。
1 | int numWays(int n){ |
复杂度分析
时间复杂度:
空间复杂度:,如果是第二个方法的话,空间复杂度是
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!