有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3 输出:4 说明: 有四种走法
示例2:
输入:n = 5 输出:13
示例代码1:
class Solution(object):
def waysToStep(self, n):
"""
:type n: int
:rtype: int
"""
if n == 1:
return 1
if n == 2:
return 2
tmp1, tmp2, tmp3 = 1, 2, 4
for i in range(3, n):
tmp1, tmp2, tmp3 = tmp2, tmp3, tmp1 + tmp2 + tmp3
tmp1 %= 1000000007
tmp2 %= 1000000007
tmp3 %= 1000000007
return tmp3
思路解析:这是两步上楼梯的变种,也是斐波那契数列的变种,可以用动态规划的方式进行求解。 根据题意可以得出,当小孩站在第n阶台阶上的时候,他上来的方式有三种,一种是走一个台阶,一种是走两个台阶,一种是走三个台阶,因此小孩上到第n阶台阶总的方式便等于从第n-1阶台阶上来的方式 + 从第n-2阶台阶上来的方式 + 从第n-3阶台阶上来方式的和。例如在第四个台阶上,小孩可能从第1阶台阶上来,可能从第二节阶上上来,可能从第第三个台阶上上来,因此f(4)=f(3)+f(2)+f(1)=7。 因此可以得到递推公式 f(n)=f(n-1)+f(n-2)+f(n-3),n>3。 f(1)=1,f(2)=2,f(3)=3。 这个题利用动态规划的想法,但是不适合用递归,用递归的话会进行大量重复的计算,因此用迭代的方式进行求解。时间复杂度为O(n),空间复杂度为O(1)。