三步问题(求n中方式)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值