您当前的位置: 首页 > 

IT之一小佬

暂无认证

  • 0浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

三步问题(求n中方式)

IT之一小佬 发布时间:2021-07-26 18:00:40 ,浏览量:0

有个小孩正在上楼梯,楼梯有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)。 

关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.0439s