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

个人主页: 起名字真南的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.mzph.cn/pingmian/63817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MacOS 上以源码形式安装 MySQL 5.7

以下是在 macOS 上从源码安装 MySQL 5.7 的步骤&#xff1a; 前置条件 安装 Homebrew&#xff1a;如果你还没有安装 Homebrew&#xff0c;可以在终端中运行以下命令进行安装&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install…

源码编译安装MySQL

MySQL相应版本的tar包下载 在5.7的版本的MySQL编译安装的时候&#xff0c;需要依赖C语言的库文件【boost】&#xff0c; 如上图所示&#xff0c;如果你使用第一个MySQL的tar包&#xff0c;还需要去网上去下载boost即C语言的库文件&#xff0c;但是第二个tar包就既包含MySQL的源…

Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000

Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000 01 前言 大数据系列&#xff0c;学到了Hive&#xff0c;搭建环境的时候&#xff0c;因为使用的是本机WSL2&#xff08;别问为啥不用VMware&#xff0c;问就是条件有限&#xff0c;而且WS…

定时/延时任务-Netty时间轮源码分析

文章目录 1. 概要2. 参数3. 构造器4. 回收5. 启动时间轮 - start6. 停止时间轮 - stop7. 添加任务8. 工作线程 - Worker8.1 线程参数8.2 核心逻辑-run8.3 指针跳动到下一个tick8.4 处理要取消的任务8.5 把新增的任务加入时间轮8.6 执行过期任务 9. HashedWheelTimeout9.1 属性9…

MSF(Metasploit Framework)常用命令

MSF&#xff08;Metasploit Framework&#xff09;是一款强大的渗透测试工具&#xff0c;常用于漏洞利用、后门植入和信息收集等任务。以下是MSF常用命令分类和说明&#xff1a; 1. 基本操作命令 启动MSF控制台&#xff1a; msfconsole查看帮助&#xff1a; help清屏&#xff…

知乎数据分析面试题及参考答案

请阐述大数定理和中心极限定理的内容及其在数据分析中的应用。 大数定理是指在随机试验中,每次出现的结果不同,但是大量重复试验出现的结果的平均值却几乎总是接近于某个确定的值。简单来说,当样本量足够大的时候,样本均值会趋近于总体均值。例如,抛硬币试验,当抛硬币的次…

【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现快速排序算法。 测试说明 平台会对你编写的代码进行测试&#xff1a; 测试输入示例&#xff1a; 10 6 8 7 9 0 1 3 2 4 5 (说明&#xff1a;第一行是元素个数&a…

若依实现图片上传时自动添加水印

文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用&#xff0c;并有效保护图片版权&#xff0c;若依项目需要实现一个功能&#xff1a;上传图片时&#xff0c;自动在图片上添加水印。这不仅可以有效防止盗用&#xff…

vue web-highlighter 划词高亮功能实现及遇到的问题(线上图书)

gitcode web-highlighter 快速通道 gitHub web-highlighter 快速通道 1、下载插件 npm i web-highlighter 2、引入插件 import Highlighter from "web-highlighter"; 3、初始化插件 mounted(){this.highlighter new Highlighter({$root: document.getElementBy…

Mave下载、安装以及idea(2024)进行配置

目录 Maven简介 Maven下载 配置环境变量 配置本地仓库 在idea环境配置Maven 使用Maven创建工程 创建一个普通的java工程 创建一个Web项目 Maven简介 Maven是一个跨平台的项目管理工具&#xff0c;也是Apache组织中的一个成功的开源项目。它主要服务于基于Java的项目构…

ios 开发配置蓝牙

如果使用了蓝牙功能, 又没有配置, 会出现以下错误: This app has crashed because it attempted to access privacy-sensitive data without a usage description. The apps Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaini…

Linux 简单命令总结

1. 简单命令 1.1. ls 列出该目录下的所有子目录与文件&#xff0c;后面还可以跟上一些选项 常用选项&#xff1a; ・-a 列出目录下的所有文件&#xff0c;包括以。开头的隐含文件。 ・-d 将目录象文件一样显示&#xff0c;而不是显示其下的文件。如&#xff1a;ls -d 指定目…

【反无人机目标检测与跟踪】DUT Anti-UAV数据集介绍

DUT Anti-UAV数据集是IEEE TITS 2023上大连理工大学团队提出的Vision-based Anti-UAV Detection and Tracking论文中提出的一个可见光反无人机检测与跟踪数据集。 因为反无人机目标检测与跟踪的数据集都比较少&#xff0c;因此这个数据集也非常宝贵。 这个数据集的链接如下 数…

【JAVA】Java项目实战—Java 数据库应用项目:学生信息管理系统

本项目将实现一个简单的学生信息管理系统&#xff0c;功能包括学生信息的录入、查询、修改和删除。通过本项目&#xff0c;读者将深入理解Java与数据库交互的基本原理&#xff0c;掌握JDBC&#xff08;Java Database Connectivity&#xff09;技术&#xff0c;以及如何构建一个…

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

Android UI:ViewTree:源码分析:事件处理:显示事件

文章目录 概述测量:measure和onMeasure​​​​​​​ View.MeasureSpecViewViewGroupLinearLayoutRelativeLayout布局:layout和onLayout ViewViewGroupLinearLayoutRelativeLayout绘制:dispatchDraw、draw和onDraw ViewViewGroupLinearLayoutRelativeLayout总结概述 显示事…

Angular由一个bug说起之十二:网页页面持续占用CPU过高

随着网络日益发达&#xff0c;网页的内容也更加丰富&#xff0c;形式也更加多样化。而随之而来的性能问题也不容小觑。这篇文章我会根据我在实践中遇到的一个问题来总结&#xff0c;我在面对性能问题的一些解决步骤&#xff0c;希望能对大家有所启发。 查找问题原因 我接触的…

游戏引擎学习第44天

仓库: https://gitee.com/mrxiao_com/2d_game 向量数学的重要性 矢量数学非常重要&#xff0c;因为 它在某种程度上类似于将C和C视为高于汇编语言的语言&#xff0c;从而使得我们能够以略高的层次思考问题&#xff0c;同时保留大部分性能好处和直接访问的类型。这种思维方式就…

Android中bindService和startService启动服务有何区别

Android中bindService和startService启动服务有何区别 bindService 和 startService 是 Android 中两种用于与 Service 交互的方式&#xff0c;它们的区别主要在于 生命周期管理 和 使用场景。以下是详细对比&#xff1a; 1. bindService方式 bindService 是一种绑定方式&am…

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif &#xff0c;/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…