前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【动态规划篇】面试题 08.01. 三步问题

【动态规划篇】面试题 08.01. 三步问题

作者头像
_孙同学
发布2025-03-14 09:58:43
发布2025-03-14 09:58:43
5800
代码可运行
举报
文章被收录于专栏:技术分享技术分享
运行总次数:0
代码可运行

面试题 08.01. 三步问题

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

示例 1:

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

输入: n = 5 输出: 13 提示:

n范围在[1, 1000000]之间

解题思路:

  1. 状态表示 dp[i]表示:到达i位置时一共有多少种方法
  1. 状态转移方程 以i位置的状态,最接近的一步来划分问题 第一种情况是从i-1的位置跳一步到达i 第二种情况是从i-2的位置跳两步到达i 第三种情况是从i-3的位置跳三步到达i

dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]

  1. 初始化 保证填表时不越界 若i = 0时会出现负数,同理i=2,3也是 dp[1] = 1,dp[2] = 2,dp[3] = 4
  2. 填表顺序 从左往右
  3. 返回值 dp[n]

代码实现:

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    int waysToStep(int n) {
        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回值

        const int MOD = 1e9 + 7;

        //处理边界问题
        if (n == 1 || n == 2) return n;
        if (n == 3) return 4;

        vector<int> dp(n + 1);//因为要返回n的值,所以要创建n+1
        dp[1] = 1, dp[2] = 2, dp[3] = 4;
        for (int i = 4; i <= n; i++)
            dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;

        return dp[n];
    }
};

时间复杂度:O(n) 空间复杂度:O(n)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面试题 08.01. 三步问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档