剑指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;}
};