1. 普通型
问题概述:有一只青蛙,每次可以跳1阶台阶,也可以跳2阶台阶,现在有n阶台阶,问该只青蛙有多少种不同的方法爬到第 n 阶?
通过简单计算,我们可以发现从第三个台阶开始,跳到该台阶的方法等于 前两个台阶方法之和, 非常相似斐波那契数列的问题
即:1,2,3,5,8,11,13…
1.1 递归
class Step_jumping {
public:
int climbStairs(int n) {
if(n == 1) {
return 1;
} else if (n == 2) {
return 2;
} else {
return climbStairs(n-1) + climbStairs(n - 2);
}
}
};
1.2 迭代
class Solution {
public:
int climbStairs(int n) {
if(n == 1) {
return 1;
} else if (n == 2) {
return 2;
} else {
int pre1 = 1, pre2 = 2, ret =2;
for(int i = 3; i <= n; i++) {
/* 计算跳到当前台阶方法总数 */
ret = pre1 + pre2;
/* 更新前两台阶 */
pre1 = pre2;
pre2 = ret;
}
return ret;
}
}
};
1. 3 动态规划
class Solution {
public:
int climbStairs(int n) {
vector<int> array;
array.push_back(1);
array.push_back(2);
for(int i = 2; i < n; i++) {
array.push_back(array[i-1] + array[i - 2]);
}
return array[n-1];
}
};
2. 进阶型
问题概述:有一只青蛙,每次可以跳 n 阶台阶,问该只青蛙有多少种不同的方法爬到第 n 阶?
2.1 迭代
由上图简单计算总结规律,可知:跳到n阶的方法是跳到 n-1 阶的 2 倍
class Step_jumping {
public:
int climbStairs(int n) {
if(n == 1) {
return 1;
} else {
return 2 * climbStairs(n - 1);
}
}
};
2.2 总结规律
f(n) = 2^(n - 1)