剑指offer的一道简单题目。
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:1≤n≤40
要求:时间复杂度:O(n) ,空间复杂度: O(1)
示例1
输入:
2
返回值:
2
说明:
青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。因此答案为2
示例2
输入:
7
返回值:
21
因为这道题和我写的另一道斐波拉契数列做法一样。我直接放代码了,想看的可以去看我动态规划收藏夹里的斐波拉契数列。
方法一:递归
class Solution {
public:
int jumpFloor(int number) {
if (number<=1) return 1;
return jumpFloor(number-1)+jumpFloor(number-2);
}
};
方法二:记忆化搜索
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));
}
};
方法三:动态规划
class Solution {
public:
int dp[50]{0};
int jumpFloor(int number) {
dp[0] = 1, dp[1] =1;
for (int i = 2 ; i <= number ; i ++) dp[i] = dp[i-1]+dp[i-2];
return dp[number];
}
};
class Solution {
public:
int jumpFloor(int number) {
int a = 1 , b = 1 , c = 1;
for (int i = 2 ; i <= number ; i ++) {
c = a+b , a = b , b = c;
}
return c;
}
};