【Leetcode每日笔记】面试题 08.01. 三步问题(Python)

文章目录

  • 题目
  • 解题思路
    • 动态规划
      • 状态定义
      • 状态转移方程
    • 优化—矩阵快速幂(从O(n)加速到O(logn))
  • 代码

题目

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

输入:n = 3 输出:4 说明: 有四种走法

示例2:

输入:n = 5 输出:13

提示:

n范围在[1, 1000000]之间

解题思路

动态规划

状态定义

dp[i]表示达到第i阶台阶的方法,显而易见,dp[1]=1,dp[2]=2.dp[3]=4,那么到达第四阶台阶,只能从第一阶或者第二阶或者第三阶过来,那么dp[4]=dp[1]+dp[2]+dp[3]

状态转移方程

dp[i]=dp[i-1]+dp[i-2]+dp[i-3],(4≤i≤n)

优化—矩阵快速幂(从O(n)加速到O(logn))

代码

class Solution:
    def waysToStep(self, n: int) -> int:
        dp = [0,1,2,4]
        if n <= 3:
            return dp[n]
        else:
            for i in range(4,n+1):
                dp.append((dp[i-1]+dp[i-2]+dp[i-3])
        return dp[-1]%1000000007

上面的方法超时,而将取模放在每一步的后面,可以通过,就是下面的步骤

class Solution:
    def waysToStep(self, n: int) -> int:
        dp = [0,1,2,4]
        if n <= 3:
            return dp[n]
        else:
            for i in range(4,n+1):
                dp.append((dp[i-1]+dp[i-2]+dp[i-3])%1000000007)
        return dp[-1]

你可能感兴趣的:(LeetCode一周一结,#,动态规划,动态规划,算法,leetcode,python,快速幂)