LeetCode.面试题 08.01.三步问题
点击这里跳转此题:面试题 08.01. 三步问题
题目描述:
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
提示:
- n范围在[1, 1000000]之间
解题过程:
1.递归
此题分为一阶,二阶,三阶来走,那么在不考虑时间复杂度的情况下是不是可以用递归来直接解决问题呢
分为n <= 3 和 n > 3 的情况分别进行讨论
若n > 3,则结果为 递归 : 最后一步为一阶、两阶、三阶三种情况相加的结果,这种思路一直向前递归回溯即可求出答案,
那么来看代码:
class Solution {
public:
int waysToStep(int n) {
if(n == 1) return 1;
else if(n == 2) return 2;
else if(n == 3) return 4;
//最后一步可能为一阶、两阶、三阶 三种可能,都列举出来,然后递归回溯向前
else
return waysToStep(n - 1) + waysToStep(n - 2) + waysToStep(n - 3);
//猜想:这里看起来有点像斐波那契数列的递归式啊,那么其非递归是不是也可以模仿用呢?
}
};
这样下来必然超时,时间复杂度大概为 3^n,因为上述式子看起来有点像斐波那契数列或者说是三叉树,故可以想到递归转递推:
2.递推
class Solution {
public:
int waysToStep(int n) {
long long a = 1,b = 2,c = 4;
long long t = 0;
for(int i = 2; i <= n; i++) {
//此处在碰到大数时候会出现>int,所以定义long long 类型的 t来临时存储
t = (a + b) % 1000000007;
a = b;
b = c;
c = (t + c) % 1000000007;
}
return a;
}
};
3.看网上还有一种很妙的思路解法:
利用线性递归转换成矩阵算法求解,利用矩阵的传递性,最终可以实现0ms通过题目
简直太妙,可惜自身矩阵学的一塌糊涂……没能一下理解,哎,先记录下来
等学会相关知识后,再更新矩阵解法……
最后
要是有大神会的话,可以提供下思路和心得在评论区大家共同学习感谢!
期待大家的关注和共同进步~