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