LeetCode 75 —— 70. 爬楼梯

LeetCode 75 —— 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 阶

提示:

1 <= n <= 45

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/climbing-stairs

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目我的第一想法自然是递归咯,使用dfs来完成该题,以n为0和1时返回1作为递归退出的出口。至于递归的方法是将n-1和n-2的返回的值之和作为当前 climbStairs(n)的值。

    func climbStairs(n int) int {if n == 0 || n == 1{return 1}return climbStairs(n-1) + climbStairs(n-2)
    }
    

    但是,万万没有想到,这样居然超时了,当n等于44时,就超时了!

    image-20221019211355689

    于是,我有一种思路,就是利用切片保存每次计算的结果,每次只需要找到切片元素前面两个值相加即可。我们只需要给切片放入初始值2个1,然后如果n小于2的话,我们就直接返回1。然后从i等于2开始,一直到n,我们将切片元素赋值为前两个元素之和然后放入切片即可。最后返回切片arr的索引为n的元素即可。

    func climbStairs(n int) int {var arr []int = make([]int,0,5)if n<2{return 1}arr = append(arr,1,1)for i:=2; i<=n; i++{arr = append(arr,arr[i-1]+arr[i-2])}return arr[n]
    }
    
  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是一次通过的,使用递归的方法会超时,所以我使用数组,以空间换时间,成功解决了此题,不过内存消耗较大!

    image-20221019212702336

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    下面这种方法使用的内存就比我的方法少,只需要3个 变量即可,不需要保存所有的路径,如果n等于很大的值的话,我那种方法就消耗内存比较多,所以这是一种优化方案!

    class Solution {
    public:int climbStairs(int n) {if(n == 1){return 1;}if(n == 2){return 2;}int a = 1, b = 2, temp;for(int i = 3; i <= n; i++){temp = a;a = b;b = temp + b;}return b;   }
    };
    

    image-20221019213220246

    type matrix [2][2]intfunc mul(a, b matrix) (c matrix) {for i := 0; i < 2; i++ {for j := 0; j < 2; j++ {c[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j]}}return c
    }func pow(a matrix, n int) matrix {res := matrix{{1, 0}, {0, 1}}for ; n > 0; n >>= 1 {if n&1 == 1 {res = mul(res, a)}a = mul(a, a)}return res
    }func climbStairs(n int) int {res := pow(matrix{{1, 1}, {1, 0}}, n)return res[0][0]
    }作者:LeetCode-Solution
    链接:https://leetcode.cn/problems/climbing-stairs/solution/pa-lou-ti-by-leetcode-solution/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

三、AC 代码:

func climbStairs(n int) int {var arr []int = make([]int,0,5)if n<2{return 1}arr = append(arr,1,1)for i:=2; i<=n; i++{arr = append(arr,arr[i-1]+arr[i-2])}return arr[n]
}

四、总结:

这三种解法中,我的方法时间复杂度和空间复杂度都为O(n),其他解法中第一种解法时间复杂度也为O(n),但是其空间复杂度为O(1)。而矩阵快速幂解法的时间复杂度为O(log n),空间复杂度为O(1)。

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

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

相关文章

《操作系统》- 操作系统的基本概念

目录 一、操作系统的概念1.1 操作系统的分类1.2 计算机系统的构成1.3 操作系统都做了哪些事 二、操作系统的目标和功能2.1 操作系统的目标2.2 操作系统的功能 三、操作系统的特征3.1 并发3.2 共享3.3 虚拟3.4 异步 一、操作系统的概念 1.1 操作系统的分类 UNIX是非常早期的操作…

uniapp监听手机侧滑返回事件。

这篇文章是应一个粉丝的需求更新的&#xff01;你们看我多宠粉&#xff01; 若在App首页&#xff0c;点击手机物理返回键&#xff0c;此时无返回页面可关闭&#xff0c;uni-app默认会提示“再按一次退出应用”&#xff1b;若想自定义退出信息&#xff0c;如修改为&#xff1a;…

UE4/5动画系列(3.通过后期处理动画蓝图的头部朝向Actor,两种方法:1.通过动画层接口的look at方法。2.通过control rig的方法)

目录 蓝图 点积dot Yaw判断 后期处理动画蓝图 动画层接口 ControlRig: 蓝图 首先我们创建一个actor类&#xff0c;这个actor类是我们要看的东西&#xff0c;actor在哪&#xff0c;我们的动物就要看到哪里&#xff08;同样&#xff0c;这个我们也是做一个父类&#xff0…

第2章 k-近邻算法

文章目录 第2章 k-近邻算法2.1k-近邻算法概述2.1.1准备&#xff1a;使用Python导入数据2.1.2实施kNN分类算法 2.2示例&#xff1a;使用k近邻算法改进约会网站的2.2.2分析数据&#xff1a;使用Matplotlib创建散点图2.2.3准备数据&#xff1a;归一化数值2.2.4测试算法 第2章 k-近…

【C++11】左值引用 与 右值引用

定义 左值 / 左值引用 左值&#xff08;Lvalue&#xff09;&#xff1a; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以 对它取地址 可以对它赋值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出现在赋值符号左边。定义时const修…

网络系统集成实验(五)| 系统集成路由器OSPF动态、综合路由配置

一、前言 该系列文章将会对网络系统集成课程中相关实验进行更新&#xff0c;本篇为第五篇&#xff0c;有关路由器的OSPF、综合路由配置&#xff0c;包括了OSPF的配置实验、单臂路由实验、RIP配置实验、综合实验等。 注意&#xff1a;该实验的后半部分综合实验基于前面的实验&am…

在idea中高并发下的分布式锁以及解决方法

案例:1.互联网秒杀 2.抢优惠卷 3.接口幂 引入pom文件 <packaging>war</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.8.RELEA…

Python 基本数据类型(三)

文章目录 每日一句正能量数值运算数值类型实例String&#xff08;字符串&#xff09; 每日一句正能量 人的相处&#xff0c;靠的是真心&#xff0c;不是套路。合得来的人&#xff0c;坦诚相待&#xff0c;合不来的人&#xff0c;客气寒暄&#xff1b;谁也别给谁冷脸看&#xff…

自然语言处理从入门到应用——预训练模型总览:迁移学习与微调

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …

【夜深人静学数据结构与算法】回溯算法

目录 前言&#xff1a; 回溯算法&#xff1a; 回溯法的常见应用: 回溯法的模板: 回溯法的图解&#xff1a;​ 案例&#xff1a; 77. 组合 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 回溯算法是一个比较抽象的算法&#xff0c;因此我们…

基于Springboot+vue的垃圾分类网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Transformer(四)--实现验证:transformer 机器翻译实践

转载请注明出处&#xff1a;https://blog.csdn.net/nocml/article/details/125711025 本系列传送门&#xff1a; Transformer(一)–论文翻译&#xff1a;Attention Is All You Need 中文版 Transformer(二)–论文理解&#xff1a;transformer 结构详解 Transformer(三)–论文实…