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

news2024/12/23 10:15:47

【题目描述】

假设你正在爬楼梯。需要 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.coloradmin.cn/o/1630526.html

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

相关文章

EI会议、投稿优惠2024年计算机科学与神经网络国际会议(ICCSNN 2024)开始征稿啦!!

2024 International Conference on Computer Science and Neural Networks 一、大会信息 会议名称&#xff1a;2024年计算机科学与神经网络国际会议会议简称&#xff1a;ICCSNN 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;http…

蓦然回首,追忆那些备战OCM的日子

蓦然回首 前段时间偶然在墨天轮群看到一位在墨天轮轮社区非常活跃的老兄发的《那些年&#xff0c;我们一起追过的OCP》的文章&#xff0c;获悉墨天轮在举办【我的备考经验】的有奖征文活动&#xff0c;打开那篇文章&#xff0c;一下子又把我的思绪拉回到了好几年前&#xff0c;…

ruoyi实现大文件上传

前端&#xff1a; 安装依赖 1.在package.json文件中添加"vue-simple-uploader": "^0.7.4","spark-md5": "^3.0.1"到dependencies中&#xff1b;devDependencies中"node-sass": "^4.9.0", "sass-loader&quo…

Redis面试题三(集群)

目录 1.Redis 集群搭建有几种模式 2.Redis 主从复制的实现 全量同步 增量同步 3.Redis 的主从同步策略 1. 全量同步&#xff08;Full Resynchronization&#xff09; 2. 增量同步&#xff08;Incremental Replication&#xff09; 4.Redis一致性hash 基本原理 节点动态…

BAPI_ACC_DOCUMENT_POST 凭证过账及增强

METHOD document_post.DATA ls_documentheader TYPE bapiache09. "表头DATA ls_accountgl TYPE bapiacgl09.DATA lt_accountgl TYPE STANDARD TABLE OF bapiacgl09. "总账项目DATA ls_accountreceivable TYPE bapiacar09.DATA lt_accountreceivable TYPE STANDARD TA…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS&#xff08;Linux Virtual Server&#xff09;的网络地址转换&#xff08;NAT&#xff09;模式是一种在网络层&#xff08;第四层&#xff09;实现负载均衡的方法。在NAT模式中&#xff0c;Director Server&#xff08;DS&#xff09;充当所有服务…

[Diffusion Model笔记] DDPM数学推导版 2024.04.23

本文是观看以下视频的笔记&#xff1a; https://www.bilibili.com/video/BV1CU4y1i7jn/?p4&spm_id_frompageDriver 其他参考 https://zhuanlan.zhihu.com/p/614147698 https://zhuanlan.zhihu.com/p/563661713 这个写的非常详细&#xff1a; https://www.zhihu.com/ques…

【新手必读】Airtest测试Android手机常见的设置问题

经常有新手同学在使用Airtest测试Android手机的时候&#xff0c;遇到各式各样的问题&#xff0c;其中很大一部分&#xff0c;都是因为Android手机的设置不当&#xff0c;比如&#xff1a; 因为没有登录华为/荣耀/小米账号&#xff0c;而无法开启USB调试功能 因为没有关闭防止恶…

06_Scala流程控制

文章目录 [toc] 1.流程控制**小结&#xff1a;** **2. Scala中流程控制没有三元运算符****2.1 Scala中如果逻辑代码只有一行可以省略花括号****小结&#xff1a;** **3. 循环控制****3.1 for控制****3.2循环守卫 --> 循环表达式添加逻辑判断****3.3 循环步长 --> 表示循环…

IntelliJ IDEA 如何启用 JDK 预览特性

IntelliJ IDEA 也可以启用 JDK 的预览特性。 针对项目&#xff0c;选择项目结构。 配置是在语言结构上。 单击语言结构上的 SDK 默认&#xff0c;往下拉&#xff0c;就可以看到针对新版本的选项。 同时还可以看到那些版本是支持新特性预览的&#xff0c;那些版本是不支持新特…

Python 使用相对路径读取文件失败

python open一个问及那时使用绝对路径可以&#xff0c;但是使用相对路径时报错&#xff0c;找不到指定文件 解决步骤如下&#xff1a; 添加Python配置 在新增的配置Json文件添加下图红框这一行

Linux——(关于权限常见的3个问题)

文章目录 1.修改文件或者目录的拥有者和所属组1.1chown指令1.2chgrp指令 2.常见的权限三个问题2.1对应一个目录&#xff0c;如果要进入&#xff0c;需要什么权限&#xff1f;2.2为什么我们创建的文件默认权限不是7772.2.1关于Linux下的权限掩码 2.3文件能否被删除取决于什么2.3…

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

吴恩达2022机器学习专项课程(一) 6.2 逻辑回归第三周课后实验:Lab2逻辑回归

问题预览/关键词 逻辑回归预测分类创建逻辑回归算法Sigmoid函数Sigmoid函数的表示sigmoid输出的结果Numpy计算指数的方法实验python实现sigmoid函数打印输入的z值和sigmoid计算的值可视化z值和sigmoid的值添加更多数据&#xff0c;使用逻辑回归可以正常预测分类![在这里插入图片…

GMSSL编译iOS

一、GMSSL-2.x 国密SDK源码下载&#xff0c;对GMSSL库进行编译生成对应的静态库。执行如下命令&#xff1a; cd到SDK源码目录 cd /Users/xxxx/Downloads/GMSSLV2-master查看SDK适用环境 ./config上图中错误解决方法 使用文本编辑器打开SDK目录下Configure、test/build.info、…

第十五届蓝桥杯省赛第二场C/C++B组C题【传送阵】题解(AC)

解题思路 由于 a a a 数组是一个 1 1 1 到 n n n 的一个排列&#xff0c;那么形成的一定是如下形式&#xff1a; 一定会构成几个点的循环&#xff0c;或者是几个单独的点。 从任意点开始&#xff0c;如果能进入一个循环&#xff0c;一定可以将整个循环的宝藏都拿走&#x…

android room 数据库升级的原则

1.如果新加了一张数据表则什么都不用干直接database那里将数据库版本升1 就可以nichuang 在entities里增加新加的entity ProviderMeta.DB_VERSION 版本号增1 room会自动生成 一个ProviderMeta.DB_VERSION 版本号的json文件 比如实例中升级到70 就会生成一个70.json的文件这是r…

发电厂智能巡检机器人:让发电厂更安全、更高效

在发电厂的众多应用场景中&#xff0c;升压站、化学车间、空冷塔、输煤皮带、综合管廊等&#xff0c;一直以来都是人工巡检的主战场。然而&#xff0c;这些场所环境极为复杂&#xff0c;人工巡检面临着诸多难题&#xff0c;强度大、频率低、间隔长等问题突出。这使得设备在运行…

三星应用TRIZ创新方法的经验分享:探索科技前沿的奥秘

TRIZ&#xff0c;即发明问题解决理论&#xff0c;于1946年被提出。它是一种基于知识和经验的创新方法&#xff0c;旨在帮助人们快速有效地解决各种复杂问题。TRIZ理论包含了大量的创新原理、算法和工具&#xff0c;可以帮助企业快速识别问题、寻找解决方案&#xff0c;并推动创…

【前端】VUE项目创建

在所需文件夹中打开cmd命令行窗口&#xff0c;输入vue ui 进入web可视化界面选择创建新项目 根据需求依次完成下列选择&#xff0c;下列是参考配置&#xff0c;完成后点击创建项目即可 最终显示完成