描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
要求:时间复杂度:O(n),空间复杂度: O(1)
解题思路
方法一:递归
假设f[i]表示在第i个台阶上可能的方法数。逆向思维。如果我从第n个台阶进行下台阶,下一步有2中可能,一种走到第n-1个台阶,一种是走到第n-2个台阶。所以f[n] = f[n-1] + f[n-2]. 那么初始条件了,f[0] = f[1] = 1。 所以就变成了:f[n] = f[n-1] + f[n-2], 初始值f[0]=1, f[1]=1。
class Solution {
public:
int jumpFloor(int number) {
if(number<=1) return 1;
return jumpFloor(number-1)+jumpFloor(number-2);
}
};
时间复杂度:O(2^n) 空间复杂度:递归栈的空间
方法二:记忆化搜索
class Solution {
public:
int f[50]{0};
int jumpFloor(int number) {
if(number<=1) return 1;
if(f[number]>0) return f[number];//如果计算过就不重复计算了
return f[number]=(jumpFloor(number-1)+jumpFloor(number-2));
}
};
时间复杂度:O(n), 没有重复的计算 。空间复杂度:O(n)和递归栈的空间