【OJ题解】面试题三步问题

ops/2024/12/18 3:17:24/

个人主页: 起名字真南的CSDN博客

个人专栏:

  • 【数据结构初阶】 📘 基础数据结构
  • 【C语言】 💻 C语言编程技巧
  • 【C++】 🚀 进阶C++
  • 【OJ题解】 📝 题解精讲

在这里插入图片描述


题目链接

三步问题


解题思路

1. 问题分析

小明在上楼时可以选择每次上 1 个台阶2 个台阶3 个台阶,需要计算总共有多少种方法能爬上 ( n ) 级台阶。


2. 递归思路

将问题分解为子问题:

  • 每次可以上 1、2 或 3 个台阶,那么上到第 ( n ) 级台阶的方法数可以分为以下三种情况:
    1. 从 ( n-1 ) 级跳上来(方法数为 ways(n-1))。
    2. 从 ( n-2 ) 级跳上来(方法数为 ways(n-2))。
    3. 从 ( n-3 ) 级跳上来(方法数为 ways(n-3))。

于是有递推公式:
[
ways(n) = ways(n-1) + ways(n-2) + ways(n-3)
]


3. 优化方案:动态规划

使用动态规划减少重复计算,定义三个变量 abc 分别记录上到 ( n-3 )、( n-2 )、( n-1 ) 级台阶的方法数:

  1. 初始值

    • ( ways(1) = 1 )
    • ( ways(2) = 2 )
    • ( ways(3) = 4 )
  2. 状态转移方程

    • ( ways(n) = (a + b + c) \mod 10^9+7 )
    • 循环计算新的方法数,并依次更新 abc 的值。

4. 时间与空间复杂度

  • 时间复杂度: ( O(n) ),单次遍历计算。
  • 空间复杂度: ( O(1) ),仅使用常数空间存储中间值。

代码实现

以下是 C++ 示例代码:

class Solution {
public:int waysToStep(int n) {const int MOD = 1000000007;  // 定义取模数if (n < 3) return n;        // 特殊情况:小于 3 的台阶直接返回if (n == 3) return 4;       // 特殊情况:3 级台阶直接返回int a = 1; // 1 级台阶的方法数int b = 2; // 2 级台阶的方法数int c = 4; // 3 级台阶的方法数int ret = 0;for (int i = 4; i <= n; i++) {ret = ((a + b) % MOD + c) % MOD; // 递推公式取模a = b; // 更新 a 为 bb = c; // 更新 b 为 cc = ret; // 更新 c 为当前结果}return c; // 返回最终结果}
};

代码要点

  • 取模运算:为避免整数溢出,在计算 a + b 和加上 c 时分别取模 ( \mod 10^9+7 )。
  • 初始值设置:根据题意直接设置 ( ways(1) = 1 ),( ways(2) = 2 ),( ways(3) = 4 )。
  • 迭代更新:通过三个变量 abc 滚动更新,无需额外空间。

总结

  • 递归与动态规划:递归形式简单但效率低,动态规划通过状态转移优化性能。
  • 时间复杂度优化:从递归的指数时间复杂度 ( O(3^n) ) 降至线性时间 ( O(n) )。
  • 空间复杂度优化:仅用三个变量存储中间状态,节省内存。

如果有疑问或改进建议,欢迎在评论区留言! 😊


http://www.ppmy.cn/ops/142792.html

相关文章

【深度学习项目】目标检测之YOLO系列-V5(三)

介绍 YOLOv5 是由 Ultralytics 公司开发的一个目标检测模型&#xff0c;它不是由原始 YOLO 系列的作者 Joseph Redmon 提出的。尽管如此&#xff0c;YOLOv5 在社区中非常受欢迎&#xff0c;并且由于其易于使用、快速迭代和良好的性能而被广泛采用。 主要特点 模型大小与速度的…

基于深度学习的猫狗识别系统【深度学习课设】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…

uniApp顶部导航栏右侧添加按钮

记录一下从阿里图库里面下载图标到项目中遇到的问题。原先图标引入后在浏览器可以正常显示&#xff0c;但是真机显示不了图标。后解决 首先 先下载到本地&#xff0c;然后解压后再要两个文件 在uniapp项目文件中引入&#xff0c;我这里是/static/iconfont/ 然后重点&#xff0…

【Solidity】变量详解:类型、作用域与最佳实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Solidity变量详解&#xff1a;类型、作用域与最佳实践引言1. 变量的类型与声明1…

游戏引擎学习第52天

仓库 : https://gitee.com/mrxiao_com/2d_game 这节的内容相当多 回顾 在游戏中&#xff0c;实体被分为不同的类别&#xff1a;接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理&#xff0c;接…

【Apache paimon】-- 集成 hive3.1.3 异常

目录 1、场景再现 Step1:在 hive cli beeline 执行创建 hive paimon 表 Step2:使用 insert into 写入数据 Step3:抛出异常 2、原因分析 Step1:在 yarn resource manager 作业界面查询 hive sql mr job 的 yarn log Step2:搜索job 使用的 zstd jar 版本 Step3:定…

【kafka】kafka安装(ubuntu+jdk+zookeeper)

前置安装 1.jdk安装与环境变量配置 安装 OpenJDK 21或者其他版本 sudo apt update sudo apt install openjdk-21-jdk使用 readlink 命令查找 java 的路径 readlink -f $(which java)复制 永久设置JAVA_HOME # 粘贴路径/usr/lib/jvm/java-21-openjdk-amd64 echo "e…

Ubuntu系统下部署大语言模型:Ollama和OpenWebUI实现各大模型的人工智能自由

之前在window下安装过 Ollama和OpenWebUI搭建本地的人工智能web项目(可以看我之前写的文章),无奈电脑硬件配置太低,用qwen32b就很卡,卡出PPT了,于是又找了一台机器安装linux系统,在linux系统下测试一下速度能否可以快一些。 系统硬件介绍 Ubuntu 22.04.4 LTS CPU: i5…