LeetCode 75 —— 70. 爬楼梯

news2024/9/19 16:55:14

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]int
    
    func 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.coloradmin.cn/o/709199.html

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

相关文章

机器学习笔记 - 基于OpenCV和Vantage-point tree构建图像哈希搜索引擎

一、关于图像哈希 上一篇文章中,了解到了图像哈希是使用算法为图像分配唯一哈希值的过程。在深度学习普及之前,一些搜索引擎使用散列技术来索引图像。 言外之意目前的图像搜索引擎主要都是基于深度学习的技术,不过思路都是一样的,我们这里基于OpenCV提供的图像哈希技术构建…

python实现削苹果小游戏

也不用998只有199源码发你。 支付完发我邮箱发你源代码。

RISC-V处理器的设计与实现(三)—— 上板验证(基于野火征途Pro开发板)

文章目录 RISC-V处理器的设计与实现&#xff08;一&#xff09;—— 基本指令集_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现&#xff08;二&#xff09;—— CPU框架设计_Patarw_Li的博客-CSDN博客 RISC-V处理器的设计与实现&#xff08;三&#xff09;—— 上板验…

Gradle安装与配置(8.2)

一、下载地址 https://gradle.org/releases/ https://downloads.gradle.org/distributions/gradle-8.2-bin.zip 解压后放到合适的位置 二、配置环境变量并测试 D:\ProgramFiles\gradle-8.2\bin gradle -v 三、配置镜像 D:\ProgramFiles\gradle-8.2\init.d init.gradle&…

算法第36天:数组中出现次数超过一半的数字【摩尔投票法】

算法介绍 摩尔投票法&#xff1a;求众数的方法。 就是维护一个集合&#xff0c;然后我们遍历我们的数组&#xff0c;假如现在我们遍历到的数为x&#xff0c;当集合中都是x的话我们就将x放入集合中&#xff0c;如果我们遍历到的数为x&#xff0c;但是集合中有y&#xff0c;那么…

【VulnHub系列】West-Wlid1.1

实验信息 Kali&#xff1a;192.168.10.106 WestWild&#xff1a;192.168.104 实验过程 通过arp-scan查找目标主机&#xff0c;确定目标主机IP192.168.10.104 sudo arp-scan --interface eth0 192.168.10.0/24 探测靶机开放的端口 sudo nmap -sT --min-rate 10000 -p- 192.1…

Redis的持久化机制(1)

RDB&#xff0c;即Redis DataBase的简称。RDB是Redis默认的持久化机制 RDB持久化文件&#xff0c;速度比较快&#xff0c;而且存储的是一个二进制的文件&#xff0c;传输起来很方便 在指定的时间间隔内&#xff0c;将内存中的数据集的快照写入磁盘。默认保存在/usr/local/bin目…

122.【SpringBoot - 再刷 - 基础入门 - 01】

SpringBoot2 核心技术 (一)、SpringBoot核心技术入门1.Spring能做什么?1.1、Spring 的能力1.2、Spring的生态1.3、Spring5重大升级1.3.1、响应式编程1.3.2、内部源码设计 2.为什么用SpringBoot2.1、SpringBoot优点2.2、SpringBoot缺点 3.时代背景3.1、微服务3.2、分布式的困难…

github克隆代码加速

https://www.gitclone.com/gogs/ 只需要在正常的git clone后的URL里&#xff0c;嵌入gitclone.com即可快速clone 举例&#xff1a; #原地址 git clone https://github.com/SpringSource/Spring-framework #新地址 git clone https://gitclone.com/github.com/SpringSource/…

2023年出货量预计增长75%,谁在领跑规模化量产赛道?

2023年将成为一个分水岭&#xff0c;中国智能驾驶市场已经进入了下一个竞争周期&#xff0c;卷&#xff0c;难 成为了智驾赛道新的关键词&#xff0c;对各赛道的供应商来说&#xff0c;未来几年将是比拼规模化与降本。 对各级供应商来说&#xff0c;产品规模化量产&#xff0c…

【二叉树part07】| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

目录 &#x1f388;LeetCode530.二叉搜索树的最小绝对差 &#x1f388;LeetCode501.二叉搜索树中的众数 &#x1f388;LeetCode236.二叉树的最近公共祖先 &#x1f388;LeetCode530.二叉搜索树的最小绝对差 链接&#xff1a;530.二叉树的最小绝对差 给你一个二叉搜索树的根…

主成分分析系列(二)为什么特征向量是主成分

在主成分分析系列&#xff08;一&#xff09;概览及数据为何要中心化这篇文章中介绍了PCA算法的大概想法及数据为何要中心化&#xff0c;在这篇文章具体推导PCA算法的过程。 1. 首先 PCA 最原始的想法是&#xff1a; 设 V \mathbf{V} V 为 d {d} d 维 线性空间&#xff08;即…

python项目导入导出依赖包

1. 导出所有依赖包 进入项目路径&#xff0c;执行以下命令&#xff1a; pip freeze > requirements.txt然后在当前目录是可以看到生成“requirements.txt”文件&#xff0c;可以打开看看&#xff0c;会发现有很多个包信息&#xff0c;其实这里是把你当前python环境的所有包…

如何编写一个含有抄底信号的副图指标

如果你作为通达信软件源代码的程序维护员&#xff0c;如何编写一个含有抄底提示的副图指标&#xff1f;请看下面的的示例教程。(python语言) python # 导入所需的库 import talib # 计算移动平均线 def moving_average(data, period): ma talib.SMA(data, timeperiodperio…

江苏一学霸,高考居然考了0分,老师们调取了监控后,才发现真相

学校里的学霸&#xff0c;李明&#xff0c;一直以来都是大家羡慕的对象。他聪明伶俐&#xff0c;学习优秀&#xff0c;每次考试都能轻松取得满分。而这次高考&#xff0c;他的成绩却让所有人大跌眼镜——零分&#xff01;这个让人难以置信的结果引发了全校师生的困惑和疑问。 在…

还傻傻搞不懂MySQL事务隔离级别么(图文并茂,保证你懂!)

本文首发于公众号【看点代码再上班】&#xff0c;欢迎围观&#xff0c;第一时间获取最新文章。 原文&#xff1a;还傻傻搞不懂MySQL事务隔离级别么&#xff08;图文并茂&#xff0c;保证你懂&#xff01;&#xff09; 大家好&#xff0c;我是tin&#xff0c;这是我的第25篇原创…

MySQL 服务无法启动

问题场景&#xff1a; 启动mysql&#xff1a;net start mysql 临时解决办法&#xff1a; tasklist| findstr "mysql"taskkill/f /t /im mysqld.exemysqld --console重新打开一个cmd测试连接mysql 永久解决办法&#xff1a; 找到Mysql的根目录&#xff0c;删除dat…

云原生时代,如何通过极狐GitLab x KubeSphere 构建安全应用?

目录 DevSecOps 是什么&#xff1f;如何帮助我们打造云原生安全生态&#xff1f; 如何寻找云原生 DevSecOps 落地切入点&#xff1f; 第一层&#xff1a;K8s 安全 第二层&#xff1a;容器镜像安全 第三层&#xff1a;应用程序安全 这么多安全功能&#xff0c;如何去实现落…

RISCV Reader笔记_5 RV32A,RV32C

原子指令 RV32A 是 RISCV 支持原子操作的扩展。主要有两种实现方式&#xff1a;内存原子操作&#xff08;AMO&#xff09;&#xff0c;加载保留/条件存储&#xff08;load reserved / store conditional&#xff09; AMO&#xff1a;一个处理器对内存的操作不会被打断&#xf…

数据库建表之外键关联

0前言 摘自某一段记事&#xff1a;   在实际的开发中&#xff0c;必然遇到“编辑操作”&#xff0c;而编辑操作&#xff0c;看似简单&#xff0c;实则其影响面甚广。本着设计的“贯穿性”和逻辑一致性&#xff0c;本文将按照&#xff0c;创建基础表的字段建议&#xff0c;创…