剑指offer8_跳台阶_题解
跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
示例1
输入
1
返回值
1
示例1
输入
4
返回值
5
分析
方案一:递归
假设f(i)表示跳上i个台阶上可能的方法数。逆向思维。如果我从第n个台阶进行下台阶,下一步有2中可能,一种走到第n-1个台阶,一种是走到第n-2个台阶。所以有
\[递推公式:f(n) = f(n-1) + f(n-2)
\]
\[递归边界:f(0)=f(1)= 1
\]
/**
时间复杂度:O(2^n)
树的结点个数
空间复杂度:递归栈的空间
**/
class Solution {
public:
int jumpFloor(int number) {
if(number == 1 || number == 2){
return number;
}
return jumpFloor(number - 1) + jumpFloor(number - 2);
}
};
方案二:记忆化搜索
在递归过程中用数组将已经计算过的值保存下来
/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(n)和递归栈的空间
**/
class Solution {
public:
int j[39] = {0};
int jumpFloor(int number) {
if(number == 1 || number == 2){
return number;
}
if(j[number] != 0){
return j[number];
}
return j[number] = jumpFloor(number - 1) + jumpFloor(number - 2);
}
};
方案三:动态规划
/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(n)
**/
class Solution{
public:
int jumpFloor(int number){
if(number == 1 || number == 2)
return number;
int j[39] = {0};
j[1] = 1, j[2] = 2;
for(int i = 3; i <= number; i++){
j[i] = j[i - 1] + j[i - 2];
}
return j[number];
}
};
方案四:方案三优化
只使用3个变量a,b,c
/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(1)
**/
class Solution {
public:
int jumpFloor(int number) {
if(number == 1 || number == 2){
return number;
}
int a = 1, b = 2, c;
for(int i = 3; i <= number; i++){
c = a + b;
a = b;
b = c;
}
return c;
}
};