1. 题目
- 剑指 Offer 10- II. 青蛙跳台阶问题
- 难度:简单
2. 描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个
n级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
**输入:**n = 2
**输出:**2
示例 2:
**输入:**n = 7
**输出:**21
示例 3:
**输入:**n = 0
**输出:**1
提示:
0 <= n <= 100
3. 实现方法
3.1 方法 1
3.1.1 思路
- 递归
- 自己在草稿上模拟一遍,可以发现其实就是个斐波那契数列
- 所以可以很容易写出递归版本
- 此时时间辅助度为
3.1.2 实现
public int numWays(int n) {
// 基础情况
if(n <= 2){
return n;
}
// 递归实现
return (numWays(n - 1) + numWays(n - 2)) % 1000000007;
}
3.2 方法 2
3.2.1 思路
用一个 HashMap 来保存已经计算过的状态,然后每次从里边判断是否要计算该状态;
3.2.2 实现
static Map<Integer, Integer> map = new HashMap();
public int numWays(int n) {
if(n <= 2){
return n;
}else{
// 判断是否计算过,计算过就直接获取该值
if(map.containsKey(n)){
return map.get(n);
}else{
// 如果没有计算过,就加入该值并返回
int tmp = numWays(n - 1) + numWays(n - 2) % 1000000007;
map.put(n, tmp);
return tmp;
}
}
}
3.3 方法 3
3.3.1 思路
- 利用递归实现很简单,但是时间复杂度太高,所以考虑用动态规划的方法
- 观察可以发现,其实当前状态只和前两个状态相关,所以定义两个状态
prev和curr来前两个状态的值 - 然后然后不断切换两个状态值就可以得到最终结果
- 此时时间复杂度为
3.3.2 实现
public int numWays(int n) {
if(n == 1 || n == 0){
return n;
}
int prev = 1;
int curr = 1;
for(int i = 2; i <= n; i++){
int sum = (prev + curr) % 1000000007;
prev = curr;
curr = sum;
}
return curr;
}
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情