【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 为 b
            b = c; // 更新 b 为 c
            c = 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) )。
  • 空间复杂度优化:仅用三个变量存储中间状态,节省内存。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

a few paper talked about software building process, so I learned

see also https://martinfowler.com/bliki/BlueGreenDeployment.html https://martinfowler.com/books/continuousDelivery.html https://martinfowler.com/articles/continuousIntegration.html https://swizec.com/blog/why-software-only-moves-forward/

Jenkins参数化构建详解(This project is parameterized)

本文详细介绍了Jenkins中不同类型的参数化构建方法&#xff0c;包括字符串、选项、多行文本、布尔值和git分支参数的配置&#xff0c;以及如何使用ActiveChoiceParameter实现动态获取参数选项。通过示例展示了传统方法和声明式pipeline的语法 文章目录 1. Jenkins的参数化构建1…

Tablesaw封装Plot.ly实现数据可视化

上文介绍tablesaw的数据处理功能&#xff0c;本文向你展示其数据可视化功能&#xff0c;并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分&#xff0c;无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…

物流行业新突破:数字孪生的核心作用解析

在现代物流行业&#xff0c;效率和精准度是企业竞争的关键。随着数字化技术的发展&#xff0c;数字孪生作为一种新兴技术&#xff0c;正在智慧物流领域崭露头角。通过构建真实物流系统的虚拟映射&#xff0c;数字孪生帮助企业实现全方位的管理优化&#xff0c;为智慧物流带来了…

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代&#xff0c;手机租赁系统已经成为一种新兴的商业模式&#xff0c;非常符合当下市场需求。那么&#xff0c;在开发这样一个系统的时候&#xff0c;首先要从需求分析和市场调研开始。在这一阶段&#xff0c;你需要了解用户需要什么&#xff0…

ViewModel

ViewMode是MVVM架构模式中VM层对应的类&#xff0c;它的作用是存储界面数据&#xff0c;并和界面发生数据交互。ViewModel能感知生命周期&#xff0c;并且在界面由于配置问题发生重建时候&#xff0c;可以保持当前的数据不变。生命周期如下&#xff1a; ViewMode由ViewModePr…

Android -- [SelfView] 自定义弹窗式颜色选择器

Android – [SelfView] 自定义弹窗式颜色选择器 PS: 1. 弹框式显示&#xff1b; 2. 支持透明度设置&#xff1b; 3. 支持拖动控件选择颜色&#xff1b; 4. 支持 ARGB | HEX 数值填写预览颜色并返回&#xff1b; 5. 输出支持Hex 和 Int 两种格式&#xff1b;效果 使用方法&…

open cv学习之图片矫正

一&#xff0c;实验原理 图像矫正的原理是透视变换 图像畸变主要有两类&#xff1a;径向畸变和切向畸变。径向畸变通常会导致图像的四个角向外或向内弯曲&#xff1b;切向畸变则是由于相机与图像平面不完全平行引起的。而OpenCV 提供了一个相机标定的工具&#xff0c;能够自动…

微信开发工具卡优化

微信开发者工具优化 设置-通用设置-不勾选 使用GPU加速模式 设置-通用设置-内存限制 1024调整为2048 详情-本地设置-不勾选 启用多核心编译 详情-本地设置-勾选 自动压缩脚本和样式 app.json “lazyCodeLoading”: “requiredComponents”

低空物流配送路径优化的探索

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

vue3 通过变量的值,来动态的进行class的赋值

1、需求&#xff1a;不同的设备因为宽度不一样&#xff0c;所以要做一些调整&#xff0c;但是通过tailwindcss的设置并不能满足我们的条件&#xff1a; 现在手机的屏幕大小也很大&#xff0c;设置了xl&#xff0c;发现电脑动&#xff0c;手机也在动&#xff0c;一样的效果。 2…

【开源】基于SpringBoot框架的在线视频教育平台 (计算机毕业设计)+万字毕业论文 T027

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

导游现场面试需要注意的问题

今天给大家带来一些导游现场面试需要注意的问题&#xff0c;大部分的城市导游考试已经考完了&#xff0c;但是还有一些城市的十二月份才考&#xff0c;有需要的朋友们赶紧来看&#xff0c;有备无患。 01、做好充足准备 认真准备做好每个景点的讲解介绍&#xff0c;不要抱有侥幸…

牛客刷题(总结)

目录 <1> <2> 思路 <1> 给你 4 个整数 a,b,c,d&#xff0c;你需要回答 是奇数还是偶数。 #include<stdio.h> #define int long long int f(int a) {if(a%20){return 0;}else{return 1;}} signed main() {int a,b,c,d;scanf("%lld %lld %lld %ll…

AI智算-k8s部署大语言模型管理工具Ollama

文章目录 简介k8s部署OllamaOpen WebUI访问Open-WebUI 简介 Github&#xff1a;https://github.com/ollama/ollama 官网&#xff1a;https://ollama.com/ API&#xff1a;https://github.com/ollama/ollama/blob/main/docs/api.md Ollama 是一个基于 Go 语言开发的可以本地运…

Arduino: Arduino IDE安装

目录 1.1 Arduino软件下载与安装 1.2 esp32_arduino的开发库安装 1.3 手动安装板支持包 1.1 Arduino软件下载与安装 Arduino官网下载地址&#xff1a;https://www.arduino.cc/en/software。 1.2 esp32_arduino的开发库安装 接下来安装esp32_arduino的开发库。 1.2.1 在线安…

《Hadoop大数据技术应用综合训练》----以NBA冠军球队计数为例

一、综合训练要求 案例中需要处理的文件为nba.csv,该文件记录了NBA历年总冠军的详细情况,文件的字段从左到右依次为比赛年份、具体日期、冠军、比分、亚军和当年MVP(联盟MVP是Most Valuable Player缩写,即最有价值球员),每个字段以半角逗号“,”进行分割,如图1所示。 图…

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高&#xff0c;生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间&#xff0c;人员误入或违规进入将带来严重的安全隐患。为了解决这一问题&#xff0c;迈尔微视推出了智能人体安全检测解决方案&#xff0c;为企业提供全方位的人员安全监…

使用html 和javascript 实现微信界面功能2

1.功能说明&#xff1a; 对上一篇的基础上进行了稍稍改造 主要修改点&#xff1a; 搜索功能: 在搜索框后面增加了搜索按钮。 搜索按钮调用performSearch函数来执行搜索操作。 表单形式的功能: 上传文件: 修改为表单形式&#xff0c;允许用户通过文件输入控件选择文件并上传。 …

vulhub复现CVE-2021-44228log4j漏洞

目录 一&#xff1a;漏洞概述 二&#xff1a;漏洞原理 三&#xff1a;漏洞利用 lookup功能&#xff1a; JNDI解析器&#xff1a; ldap服务&#xff1a; RMI&#xff1a; 四&#xff1a;漏洞复现 4.1靶场 4.2dnslog测试 4.3部署jndi-injection-exploit 4.4打开监听端口 4.5触发请…