题目描述
描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
数据范围:1≤n≤40。
要求:时间复杂度:O(n) ,空间复杂度: O(1)。
输入:2
返回值:2
说明:青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。因此答案为2
输入:7
返回值:21
解题思路
跳台阶:最直观的想法是,经典斐波拉契数列变形,递推公式为f(n)=f(n-1)+f(n-2)。接下来分别使用四种方法实现:递归、记忆化搜索、动态规划、滚动数组。其整体思路为:跳一级台阶一种跳法,跳两级台阶两种跳法,跳n级台阶可以是n-1级台阶再跳一级或者是n-2级台阶再跳两级。
递归:
int jumpFloor(int number) {
// 跳一级台阶一种跳法
if(number==1)
return 1;
// 跳两级台阶两种跳法
if(number==2)
return 2;
// 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
return jumpFloor(number-1)+jumpFloor(number-2);
}
记忆化搜索:
// 1<=n<=40
int memo[45]={0};
int jumpFloor(int number) {
// 跳一级台阶一种跳法
if(number==1)
return 1;
// 跳两级台阶两种跳法
if(number==2)
return 2;
// 避免重复计算 以空间换时间
if(memo[number]!=0)
return memo[number];
// 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
return memo[number]=jumpFloor(number-1)+jumpFloor(number-2);
}
动态规划:
int jumpFloor(int number) {
vector<int> dp(number+1,0);
// 跳一级台阶一种跳法
dp[1]=1;
// 跳两级台阶两种跳法
dp[2]=2;
// 递推公式dp[i]=dp[i-1]+dp[i-2]
for(int i=3;i<=number;i++)
// 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
dp[i]=dp[i-1]+dp[i-2];
return dp[number];
}
滚动数组:
int jumpFloor(int number) {
if(number==1)
return 1;
if(number==2)
return 2;
// 跳一级台阶一种跳法
int a=1;
// 跳两级台阶两种跳法
int b=2;
// 递推公式dp[i]=dp[i-1]+dp[i-2]
int c;
for(int i=3;i<=number;i++)
{
// 跳n级台阶 可以是n-1级台阶再跳一级 也可以是n-2级台阶再跳两级
c=a+b;
a=b;
b=c;
}
return c;
}
这题之前写过很多次啦~~就不多做赘述啦~~