剑指OFFER 跳台阶
递归解法
class Solution {
public:
int count = 0;
void recur(int n)
{
if(n <= 1)
{
count++;
return;
}
recur(n - 1);
recur(n - 2);
}
int jumpFloor(int number) {
recur(number);
return count;
}
};
二层递归
画出状态图,有点类似二叉树的遍历取叶子结点的个数。
动态规划解法
在写代码之前,先把问题捋清楚
这样就可以写出代码了
class Solution {
public:
vector<int> dp;
int jumpFloor(int number) {
dp.resize(number+1);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
int i;
for(i=3;i<=number;i++)
{
dp[i] = dp[i-1]+dp[i-2];
}
return dp[number];
}
};
变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
比较普通跳台阶的写法
dp[i] = dp[i-1]+dp[i-2];//为跳一级或者两极台阶的写法,那么跳n级台阶的就是把之前所有的dp加起来就行了
给出完整代码
class Solution {
public:
vector<int> dp;
int jumpFloorII(int number) {
dp.resize(number+1);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
int i;
for(i=3;i<=number;i++)
{
for(int j=0;j<i;j++)
{
dp[i] = dp[i] + dp[i-j];
}
dp[i] = dp[i] + 1;//青蛙甚至可以一次就调到最高那级台阶
}
return dp[number];
}
};