【LeetCode刷题记录】简单篇-70-爬楼梯

【题目描述】

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?


【测试用例】

示例1:

        输入:n = 2

        输出:2

        解释:有两种方法可以爬到楼顶。

                1.1阶 + 1阶

                2.2阶

示例2

        输入:n = 3

        输出:3

        解释:有三种方法可以爬到楼顶

                1.1阶 + 1阶 + 1阶

                2.1阶 + 2阶

                3.2阶 + 1阶


【思路分析】

这道题也算是一道很经典的题,读大学的时候学过,但不记得是在什么课上学过。用了两种方法求解。

先说一下这里的规律,一共n阶楼梯,每次只能走1阶或者2阶。

当n=1时,即爬1阶楼梯时,无疑只有一种方法,走1阶即可;

当n=2时,有两种方法,可以一次走2阶,也可以分两次每次走1阶;

当n=3时,爬3阶楼梯,可以从第1阶走2阶到第3阶,也可以从第2阶走1阶到第3阶,以此类推。换句话说就是,n>=3时,爬到n阶所用的方法总数可以由爬到n-1阶和爬到n-2阶推算出来,如果用func(n)表示爬n阶台阶的方法数,则func(n) = func(n-1) + func(n-2)

法一:递归

递归方法,在代码中表现为函数的自身嵌套,这也是很好想到的一种方法。刚才讲了这道题的本质规律func(n) = func(n-1) + func(n-2),在代码中func就是求方法数的函数climbStairs(n)

当n<=2时,单独处理,直接返回n;

当n>2时,返回climbStairs(n-1) + climbStairs(n-2)。

ps:递归方法在力扣中提交时,C实现可以正常AC,但是C++实现会提示超时,可能力扣对这道题设置了时间?或者我代码没写对?想了半天也没找到原因。

法二:动态规划

动态规划是一种常见的算法思想,它是一种解决多阶段决策问题的优化方法。核心思想是将原问题分解为若干个相同的子问题,分别求解这些子问题并将其结果保存下来,可以有效避免重复计算,极大提升算法效率。

在本题中,爬n阶楼梯是原问题,爬n-1阶、n-2阶....1阶楼梯都是相同的子问题,他们的解决办法相同,只需要分别解决这些问题并将结果保存在一个数组fun中,那么 fun[i] 就是爬 i 阶楼梯的方法数,最后返回fun[n]即可。

这个数组也很好求,首先fun[1]=1,fun[2]=2(fun[0]不用管,可以为0也可以为1也可以任意值,为0表示站在0阶楼梯自然也不需要什么方法爬到0阶楼梯,为1可以理解为fun[2] = fun[1] + fun[0]的计算,这时遍历就是从2开始的),从fun[3]开始遍历,每个位置都等于其前两个位置的和。

空间复杂度优化

上面动态规划的空间复杂度是O(n),实际上可以优化为O(1)。O(n)是因为创建了一个长度为n的数组,但是实际上我们只需要两个变量one和two分别存储n=1和n=2时的方法数,然后在接下来的循环中,不断更新one和two的值:

①临时变量tmp=one+two (这里的tmp相当于刚才的fun数组中的每个位置的值,只是这里不用存储,只起临时中转的作用),②one=two,③two=tmp

使one和two始终存储着对应当前n值的func[n-2]和func[n-1](func表示爬n阶楼梯的方法数,这里只是方便说明而用这个符号)

举个例子,假如n=3,那么fun[3] = fun[2] + fun[1],而one对应的就是fun[1],two对应的就是fun[2],tmp=one+two也就是在计算fun[3]。而在n=4时,需要fun[3]和fun[2],代码中one=two就相当于让one指向了fun[2],代码中two=tmp就相当于让two指向了fun[3],就这样,在一轮轮的循环中,不用额外开辟空间存储每个n的结果,循环结束后two中保存的就是fun[n]的值,就达到了优化空间复杂度的目的。


【参考代码】

法一:C实现

#include <stdio.h>//easy-70-爬楼梯
int climbStairs(int n);int main(){int n;scanf("%d", &n);int res = climbStairs(n);printf("%d\n", res);return 0;
}//法一:递归
int climbStairs(int n) {if(n<=2){return n;}else{return climbStairs(n-1) + climbStairs(n-2);}
}

法二:C实现

#include <stdio.h>//easy-70-爬楼梯
int climbStairs(int n);int main(){int n;scanf("%d", &n);int res = climbStairs(n);printf("%d\n", res);return 0;
}//法二:动态规划
int climbStairs(int n) {if(n <= 2){return n;}int fun[n+1];fun[1] = 1;fun[2] = 2;int i;for(i=3;i<n+1;i++){fun[i] = fun[i-1] + fun[i-2];}return fun[n];
}

法二优化:C实现

#include <stdio.h>//easy-70-爬楼梯
int climbStairs(int n);int main(){int n;scanf("%d", &n);int res = climbStairs(n);printf("%d\n", res);return 0;
}//法二:动态规划优化
int climbStairs(int n) {if(n <= 2){return n;}int one = 1;int two = 2;int i;for(i=3;i<n+1;i++){int tmp = one + two;one = two;two = tmp;}return two;
} 

法二:C++实现

#include <iostream>
#include <vector>
using namespace std;//easy-70-爬楼梯
class Solution {
public:int climbStairs(int n);
};//法二:动态规划 
int Solution::climbStairs(int n){if(n <= 2){return n;}vector<int> fun(n+1);fun[1] = 1;fun[2] = 2;int i;for(i=3;i<n+1;i++){fun[i] = fun[i-1] + fun[i-2];}return fun[n];
}int main(){int n;cin>>n;Solution sol;int res = sol.climbStairs(n);cout<<res<<endl;return 0;
}

法二优化:C++实现

#include <iostream>
using namespace std;//easy-70-爬楼梯
class Solution {
public:int climbStairs(int n);
};//动态规划优化 
int Solution::climbStairs(int n){if(n <= 2){return n;}int one = 1;int two = 2;int i;int tmp;for(i=3;i<n+1;i++){tmp = one + two;one = two;two = tmp;}return two;
}int main(){int n;cin>>n;Solution sol;int res = sol.climbStairs(n);cout<<res<<endl;return 0;
}

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

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

相关文章

electron 数据持久化方案

在 Electron 应用中实现数据持久化的方案多种多样&#xff0c;主要取决于你的具体需求&#xff0c;比如数据的大小、安全性要求、以及是否需要与云端同步等。以下是几种常见的数据持久化方法&#xff1a; 本地文件存储&#xff1a; JSON 文件&#xff1a;对于配置信息或小量数据…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是一个很大的服务中心&#xff0c;调用这个服务中心的各种服务&#xff08;每一种服务就是一个函数&#xff09;&#xff0c;可以帮应用程…

PyVista 3D数据可视化 Python 库 简介

Pyvista是一个用于科学可视化和分析的Python库 &#xff1b;我认为它适合做一些网格数据的处理&#xff1b; 它封装了VTK&#xff08;Visualization Toolkit&#xff09;之上&#xff0c;提供了一些高级接口&#xff0c; 3D数据可视化变得更加简单和易用。 1.安装 pyvista&…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器1.基本介绍1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器1.执行流程…

LeetCode 150. 逆波兰表达式求值

LeetCode 150. 逆波兰表达式求值 1、题目 题目链接&#xff1a;150. 逆波兰表达式求值 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 ‘’、‘-’、…

Windows电脑的显存容量查看

要查看Windows电脑的显存容量&#xff0c;可以按照以下步骤进行&#xff1a; 1、通过系统信息查看&#xff1a; 在Windows操作系统中&#xff0c;您可以使用系统信息来查看显存容量。 按下Win键 R打开“运行”对话框&#xff0c;然后输入“msinfo32”并按回车键。 在打开的系…

移动端H5页面使用Vant组件库下拉刷新和页面滚动事件冲突

Vant组件库van-pull-refresh踩坑 van-pull-refresh在开发过程会和内容中最近的拥有overflow的元素的滚动发生冲突&#xff0c;造成向上滑动的时候会下拉加载 <van-pull-refresh v-model"refreshing" refresh"onRefresh"><van-listv-model"…

如何基于Zookeeper实现注册中心模型?

在分布式系统中&#xff0c;通常会存在几十个甚至上百个服务&#xff0c;开发人员可能甚至都无法明确系统中到底有哪些服务正在运行。另一方面&#xff0c;我们很难同时确保所有服务都不出现问题&#xff0c;也很难保证当前的服务部署方式不做调整和优化。由于自动扩容、服务重…

若依ruoyi-vue中图标使用介绍

图标使用 使用方式 若依ruoyi-vue中使用全局 Svg Icon 图标组件。地址&#xff1a;src\components\SvgIcon\index.vue 该组件是在src\assets\icons\index.js文件中被注册为全局组件的&#xff0c;可以在项目任意地方使用。所有的图标都在src\assets\icons\svg目录下。可自行添…

tableau如何传参数到MySQL数据库

1、打开tableau连接本地MySQL-》新建自定义sql-》创建参数 2、新建一个简单的工作表-》把维度拖拽到行显示结果-》右键显示参数 3、参数传递到数据库sql写法 select * from yonghu where yonghu.姓名 like concat(%,<参数.姓名>,%)select * FROMabadata4WHERE abadata4…

css代码的定位及浮动

上次&#xff0c;我们解除了css的内外边距、鼠标悬停及其练习。现在我们学习css元素练习和定位。 元素转换 元素分为块元素、行元素和行内块。 display 显示&#xff1a;转换元素的类型 display:inline; display:block; display:inline-block; display:none;元素隐藏…

基于STM32单片机的汽车胎压、速度及状态监测系统设计与实现

基于STM32单片机的汽车胎压、速度及状态监测系统设计与实现 摘要&#xff1a; 随着汽车电子技术的快速发展&#xff0c;车辆状态实时监控系统的需求日益增长。本文设计并实现了一种基于STM32单片机的汽车胎压、速度及状态监测系统。该系统能够实时监测汽车的胎压、速度以及其他…

MCU自动测量单元:自动化数据采集的未来

随着科技的飞速发展&#xff0c;自动化技术在各个领域中的应用日益广泛。其中&#xff0c;MCU(微控制器)自动测量单元以其高效、精准的特性&#xff0c;成为自动化数据采集领域的佼佼者&#xff0c;引领着未来数据采集技术的革新。本文将深入探讨MCU自动测量单元的原理、优势以…

实习面试算法准备之图论

这里写目录标题 1 基础内容1.1 图的表示1.2图的遍历 2 例题2.1 所有可能的路径 1 基础内容 图没啥高深的&#xff0c;本质上就是个高级点的多叉树而已&#xff0c;适用于树的 DFS/BFS 遍历算法&#xff0c;全部适用于图。 1.1 图的表示 图的存储在算法题中常用邻接表和邻接矩…

庆祝我在CSDN上创作满四年:分享知识,共同成长

引言&#xff1a; 今天&#xff0c;我非常高兴地迎来了在CSDN平台上创作四周年的纪念日。这四年对我来说既是挑战也是成长&#xff0c;我在这里记录了自己的技术探索和心得体会&#xff0c;也收获了来自社区的宝贵知识和友谊。 正文&#xff1a; 创作初衷&#xff1a; 开始在C…

SUSE Linux Rsync+inotify精准系统同步配置实战

配置不难,也可以说难,这完全取决于需求。一.服务器状况: NFS文件服务器,存储提交的附件和图片。希望搭建一个在线的备份文件服务器,实现主服务和备份服务器之间的文件的实时同步。 Filesserver:/tmp # lsb_release -a LSB Version: n/a Distributor ID: SUSE Descri…

84.柱形图中最大的矩阵

二刷终于能过了. 思路解析: 不愧是hard,第一步就很难想, 对于每一个矩阵,我们要想清楚怎么拿到最大矩阵, 对于每个height[i],我们需要找到left和right,left是i左边第一个小于height[i]的,right是右边第一个小于height[i]的,那么他的最大矩阵就是height[i] * (right-left-…

linux下安装deepspeed

安装步骤 一开始安装deepspeed不可以使用pip直接进行安装。 这时我们需要利用git进行clone下载到本地&#xff1a; git clone https://github.com/microsoft/DeepSpeed.git 进入到deepspeed的安装目录下 cd /home/bingxing2/ailab/group/ai4agr/wzf/Tools/DeepSpeed 激活…

LeetCode-旋转链表

每日一题&#xff0c;很久没做链表的题了&#xff0c;今天做l一道相对简单的力扣中等难度题。 题目要求 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&…

Java基础入门day41

day41 约束 实体完整性 主键约束 唯一约束 自增约束 域完整性 限制列的单元格的数据的正确性 非空约束 not null&#xff0c;非空&#xff0c;此列必须有值 create table subject03(sid int primary key auto_increment,subname varchar(20) unique not null,subHour int…