LeetCode题练习与总结:爬楼梯--70

一、题目描述

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

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

示例 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

二、解题思路

  1. 如果楼梯只有 1 阶或 2 阶,那么方法数就等于楼梯的阶数,因为只有一种方法可以到达第一阶(爬一阶),有两种方法可以到达第二阶(爬两阶或先爬一阶再爬一阶)。

  2. 对于超过 2 阶的楼梯,我们使用一个循环来计算每一阶的方法数。我们初始化两个变量 a 和 b 分别为 1 和 2,它们代表到达第一阶和第二阶的方法数。

  3. 从第三阶开始,我们使用一个循环来计算每一阶的方法数。对于每一阶 i,我们计算到达它的方法数 temp,这个方法数是到达前两阶的方法数之和(a + b)。

  4. 然后,我们将 a 更新为 b,将 b 更新为 temp。这样,在下一轮循环中,a 将代表到达前一级的方法数,而 b 将代表到达当前级的方法数。

  5. 当循环结束时,b 将包含到达第 n 阶的方法数,我们将其返回作为结果。

三、具体代码

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

四、时间复杂度和空间复杂度

1. 时间复杂度
  • O(n) 这是因为代码中有一个从 3 到 n 的循环,循环的次数与 n 的值成正比。
  • 在这个循环中,每次迭代只进行了常数时间的操作(即计算两个数的和,并更新这两个数)。
  • 因此,总的时间复杂度是 O(n)。
2. 空间复杂度
  • O(1) 代码中只使用了几个固定数量的变量(a、b 和 temp)来存储中间结果,而不是使用与 n 成正比的额外空间。
  • 因此,不管输入的 n 有多大,所需的额外空间都保持不变,即常数空间。
  • 所以,空间复杂度是 O(1)。

五、总结知识点

1. 基础编程概念

  • 变量的声明和初始化:int a = 1, b = 2, temp; 声明了三个整型变量 ab 和 temp,并初始化 a 和 b
  • 循环结构:for 循环用于重复执行一组语句,直到指定的条件不再满足。在这个代码中,循环从 3 运行到 n

2. 递推关系

  • 斐波那契数列:代码使用了一个递推关系来计算斐波那契数列中的第 n 个数,即 F(n) = F(n-1) + F(n-2),其中 F(1) = 1 和 F(2) = 2

3. 动态规划

  • 动态规划是一种算法设计技术,它将复杂问题分解成更小的子问题,并存储这些子问题的解,以避免重复计算。在这个代码中,a 和 b 变量分别存储了到达前两个楼梯阶的方法数,而 temp 存储了到达当前楼梯阶的方法数。

4. 算法优化

  • 空间优化:代码通过只存储前两个斐波那契数,而不是使用数组来存储所有的斐波那契数,从而将空间复杂度从 O(n) 降低到 O(1)。

5. 边界条件处理

  • 代码首先检查 n 的边界条件,如果 n 小于等于 2,则直接返回 n,这是因为斐波那契数列的前两个数是固定的。

6. 迭代与递归

  • 虽然斐波那契数列可以通过递归方式轻松实现,但递归解决方案通常效率低下,因为它会进行大量的重复计算。这段代码使用迭代方法来计算斐波那契数列,这是一种更高效的实现方式。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具!限时免费!

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具&#xff01;限时免费&#xff01; 前言内容介绍资源特色动态&#xff0c;美丽的天空在几秒钟内即插即用 功能列表领取兑换码 前言 ^^在这个充满创意与想象的世界里&#xff0c;Unity 免费资源犹如一颗璀璨的明珠&…

react合成事件与原生事件区别备忘

朋友问起在做一个下拉框组件&#xff0c;下拉的点击事件是用react的onClick触发&#xff0c;外部区域点击关闭则用dom的原生点击事件绑定&#xff0c;问题是下拉的点击事件无法阻止冒泡到dom的原生事件。 我说&#xff0c;react的合成事件 和 原生事件是不一样的&#xff0c;尽…

三、fpga对完成过滤和校验的有效包数据进行有效像素提取、MATLAB对数据源进行处理与下发(完整实现pc机→显示器通信链路)

前言:上篇文章实现了MATLAB模拟发送UDP以太网协议数据包到fpga,能实现双沿数据→单沿数据转换,并将转换后的数据进行包过滤和crc校验,本篇内容要实现真正的从pc机下发视频数据,经过千兆以太网传输存储到fpga 的ddr3中,然后通过hdmi读出到显示屏上。 文章目录 一、模块设…

【Qt学习笔记】connect函数的使用方法总结

connect函数的使用方法总结 一&#xff0c;简介二&#xff0c;connect函数的标准格式&#xff1a;三&#xff0c;参数的含义四&#xff0c;示例五&#xff0c;注意 一&#xff0c;简介 在Qt框架中&#xff0c;connect函数用于连接信号和槽&#xff0c;是Qt信号和槽机制的核心。…

鸿蒙入门06-常见装饰器( 简单装饰器 )

装饰器是鸿蒙开发中非常重要的一个环节因为在很多地方我们都需要用到装饰器并且如果我们想高度的复用, 那么装饰器就是必不可少的一环接下来我们就来介绍一些常见的装饰器注意 : 所有装饰器首字母大写 Entry 用来装饰 struct 使用表示页面的入口 Component 装饰 struct, …

linux二元比较操作符

Linux中如果要比较两个变量或数字&#xff0c;常用二元比较操作符&#xff1b;对于整数之间的比较或字符串之间的比较会有所区别&#xff0c;梳理如下&#xff0c;供大家参考使用&#xff1a; 1.整数比较 二元比较操作符说明备注-eq等于if [ "$a" -eq "$b&quo…

基于Springboot的论坛管理系统

基于SpringbootVue的论坛管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 公告 热门帖子 论坛新天地 新闻资讯 留言反馈 后台登录 用户管理 公告管理…

java宠物领养系统的设计与实现(springboot+mysql+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的宠物领养系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Spring Bo…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目&#xff08;这个看下一篇文章吧&#xff09; 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#…

Springboot引入外部jar包并打包jar包

前言 spring boot项目开发过程中难免需要引入外部jar包&#xff0c;下面将以idea为例说明操作步骤 将需要的jar包导入到项目中 2.在maven中引入jar包 <dependency><groupId>com</groupId><!--随便填的文件夹名称--><artifactId>xxx</artif…

无人棋牌室为什么频现倒闭潮?

现在小红书抖音上关于棋牌室转让的帖子层出不穷&#xff0c;许多无人棋牌室纷纷倒闭&#xff0c;其背后的原因值得我们深思。 首先&#xff0c;选址的决策至关重要。一些商家可能过于看重场地的面积和价格&#xff0c;而忽视了其他重要的因素。事实上&#xff0c;仅仅因为房子大…

linux内核初始化成功后是如何过渡到android初始化的

Android用的linux内核&#xff0c;以完成OS该有的功能&#xff0c;例如&#xff0c;文件系统&#xff0c;网络&#xff0c;内存管理&#xff0c;进程调度&#xff0c;驱动等 &#xff0c;向下管理硬件资源向上提供系统调用。另一些Android特有驱动也放在内核之中。 当linux内核…

(delphi11最新学习资料) Object Pascal 学习笔记---第10章第1节( 对比其他编程语言中的属性)

10.1.1 对比其他编程语言中的属性 ​ 如果你将这与Java或C#进行比较&#xff0c;在这两种语言中&#xff0c;属性都映射到方法&#xff0c;但是Java中是一种隐式的映射&#xff08;属性基本上是一种约定&#xff09;&#xff0c;而不是显式的编程元素。与Java类似&#xff0c;…

【Qt】Qt安装包、源码、子模块(submodules)下载

1、Qt 4.0 ~ Qt5.14 Qt 4.0 ~ Qt5.14 离线安装包、源码和子模块(submodules)源码下载路径: https://download.qt.io/new_archive/qt/以Qt5.7.1为例,注意子模块都是源码,需要独立编译 2、Qt5.15 ~ Qt6.7 Qt5.15 ~ Qt6.7源码和子模块(submodules)源码下载路径: htt…

微服务OR单体架构

微服务OR单体架构 为什么会出现微服务和单体架构的争议&#xff1f;在实际的业务中&#xff0c;你选择的是微服务还是单体架构&#xff1f;在云上&#xff0c;哪种架构更符合未来云的发展趋势呢? 说到微服务OR单体架构&#xff0c;其实这两个场景并不存在很明确的争议界限的&a…

LabVIEW供热管道泄漏监测与定位

LabVIEW供热管道泄漏监测与定位 在现代城市的基础设施建设中&#xff0c;供热管道系统起着极其重要的作用。然而&#xff0c;管道泄漏问题不仅导致巨大的经济损失&#xff0c;还对公共安全构成威胁。因此&#xff0c;开发一种高效、准确的管道泄漏监测与定位技术显得尤为关键。…

GUI02-在窗口上跟踪并输出鼠标位置(Win32版)

(1) 响应 WM_MOUSEMOVE 消息获得鼠标位置&#xff1b; (2) 响应 WM_PAINT 将鼠标位置输出到窗口中&#xff1b; (3) 学习二者之间的关键步骤&#xff1a;调用 InvalidateRect() 以通知窗口重绘。 零. 课堂视频 在窗口上跟踪输出鼠标位置-Win32版 一、关键知识点 1. BeginPaint…

Android studio 报错无法找到android.support.v4.app.Fragment——终极解决方案

最近搞了一个小工具&#xff0c;UI界面使用了android.support.v4.app.Fragment&#xff0c;然后同事从服务器下载代码后编译报错无法找到android.support.v4.app.Fragment。 从网上找各种文章&#xff0c;国内国外都看了一遍&#xff0c;大部分解决方案原因都是说Android 9之后…

HANA SQL消耗内存和CPU线程的限制参数

HANA再处理大数据表相关的复杂Sql时&#xff0c;如果没有设置Memory和CPU线程上限的话&#xff0c;会将HANA的资源占用殆尽&#xff0c;造成HANA无法响应其他Sql请求&#xff0c;导致表现在应用服务器上就是系统卡顿的情况。解决上述问题的办法就是按照下图设置Memory(图1&…

【解决】Unity 编辑器内打开场景出现引擎崩溃问题

开发平台&#xff1a;2019.4.10f1   问题背景 1&#xff09;修改 Variant Prefab 变体制件时&#xff0c;出现外部引用的模型文件丢失导致引擎崩溃。 2&#xff09;二次打开工程时&#xff0c;在选中 该问题资产、问题资产所应用的场景等 文件对象时&#xff0c;Unity 编辑器…