LC 70.爬楼梯

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 \leq n \leq 45 1n45

解法一(动态规划)

思路分析:

  1. 对于多个子问题,采用动态规划算法;按照动规五部曲进行求解;
  2. 确定dp数组以及下标含义,即dp[i]表示第i个台阶,有多少种方法可以爬到
  3. 然后推导递推公式;因为一次可以爬1或2个台阶,即若要到达第i个台阶,可以由第i-1个台阶爬1个台阶到达,也可以由第i-2个台阶爬2个台阶到达,即到达第i个台阶的方法为,到达第i-1个台阶的方法和到第i-2个台阶方法的总和,即状态转移方程为:dp[i] = dp[i-1] + dp[i-2]
  4. 然后确定dp数组的初始化,可以简单得出;对于到第一阶台阶,由一种方法,对于到第二阶方法,有两种方法,即dp[1] = 1; dp[2] = 2
  5. 然后确定遍历顺序,即从i=3开始遍历到i=n;因为状态转移方程需要先得到状态dp[i-1]dp[i-2],否则无法得到正确的当前状态dp[i]
  6. 打印dp数组,确定是否符合思路与题意

实现代码如下:

class Solution {public int climbStairs(int n) {if (n == 1 || n == 2)return n;int[] dp = new int[n+1];dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; ++ i) {dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:39.5 MB,击败了5.28% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

解法二(状态压缩)

思路分析:

  1. 由解法一得到的状态转移方程;得知下一个状态由可表达的两个状态得出
  2. 即可以对状态数组进行压缩,使用变量ans来表示下一个需要得到的状态,使用变量ab来表示需要的两个状态

实现代码如下:

class Solution {public int climbStairs(int n) {if (n == 1 || n == 2)return n;int ans = 0;// 初始状态int a = 1, b = 2;for (int i = 3; i <= n; ++ i) {ans = a + b;	// 状态转移a = b;b = ans;}return ans;}
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:39.4 MB,击败了47.08% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

linux 常用的命令汇总

Linux 系统中有许多强大的命令&#xff0c;下面是一些常用和好用的命令汇总&#xff1a; 文件和目录操作 ls: 列出目录内容。cd: 更改当前目录。mkdir: 创建新目录。rmdir: 删除空目录。rm: 删除文件或目录。cp: 复制文件或目录。mv: 移动或重命名文件或目录。touch: 创建空文…

64B/66B编码

一、前言 8B/10B编码主要作用的优化直流平衡&#xff0c;从8bit中插2个bit进去&#xff0c;这样的话最终效果能够使长0或者长1的位数不超过5位&#xff0c;达到很好的效果。但是由于8B/10B编码的带宽利用率非常低&#xff0c;10G的带宽只有8G在传输有效数据&#xff0c;2G的带…

使用Git将文件夹上传到Github以及使用Git LFS上传大文件

使用Git将文件夹上传到Github以及使用Git LFS上传大文件

【高录用-快速见刊】2024年数字化经济与金融创新国际学术会议(ICDEFI 2024)

会议简介 2024年数字经济与金融创新国际学术会议即将召开。此次会议旨在汇集全球数字经济与金融创新领域的专家学者&#xff0c;共同探讨数字经济的发展趋势以及金融创新的路径。与会者将分享前沿研究成果&#xff0c;讨论数字技术在金融领域的应用与创新&#xff0c;并推动数…

一篇文章了解php7和php8新特性

PHP7新特性 ?? 运算符 php7以前用三目判断变量是否存在或是否为空 $a isset($_GET[a]) ? $_GET[a] : 1;php7新增null 合并运算符??快捷判断 $a $_GET[a] ?? 1;函数返回值类型声明 用:返回值类型的形式定义函数的返回值类型 <?phpdeclare(strict_types1); fun…

算法刷题记录 Day46

算法刷题记录 Day46 Date: 2024.04.13 lc 53. 最大子数组和 class Solution { public:int maxSubArray(vector<int>& nums) {// dp[i]表示以nums[i]结尾的连续子数组的最大和&#xff1b;// dp[i] max(nums[i], dp[i-1]nums[i]);若之前的最大和小于0&#xff0c;…

Unity DOTS1.0(4) Baking 和 Baker

Baking 概念&#xff1a; 把Editor中的GameObject数据转换成entities数据写入到Entity Scens里面,这个过程我们叫做BakingBaking是一种不可逆的操作&#xff0c;把低效代价昂贵的但是灵活的GameObjects转换成性能高效的Entities与Components。 作用&#xff1a; 在传统的模…

MyBatis批量插入的五种方式

MyBatis批量插入的五种方式: 一、准备工作 1、导入pom.xml依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MySQL驱动依赖 --…

【蓝桥杯日常】

美丽的2 #include <iostream> using namespace std; int main() {int cnt0; int tmp;for(int i1;i<2020;i){tmpi;//避免改变i的值while(tmp){if(tmp%102){cnt;break;//有2就跳出循环} tmp/10;}}cout<<cnt;return 0; }基础不牢地动山摇是我这样的。这个题花费的…

韩顺平 | 零基础快速学Python(15) 错误和异常

概述 Python有两种不同的错误&#xff1a;语法错误和异常。 语法错误SyntaxError/句法错误/解析错误&#xff1a;执行前编译器检测到的错误。语法错误也是一种异常&#xff0c;SyntaxError继承Exception。 异常Exception&#xff1a;执行时检测到的错误。 需求&#xff1a;出…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取配置项

github求⭐ vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#xff09;配置项文档 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;搜索…

Linux命令-dris命令(显示和清空目录堆栈中的内容)

说明 dris命令 用于显示和清空目录堆栈中的内容。 语法 dris(选项)选项 n&#xff1a;显示从左边算起第n笔的目录&#xff1b; -n&#xff1a;显示从右边算起第n笔的目录&#xff1b; -l&#xff1a;显示目录完整的记录。

Java 8 Date API:深挖`LocalDate.plusWeeks(1)`方法的使用及潜在“陷阱”

这里写目录标题 引言方法介绍潜在“陷阱”与注意事项1. 对于跨越月份和年份边界的情况2. ISO周定义的影响3. 时间区间的理解和使用 正确使用与规避“陷阱”结语 引言 在Java 8中&#xff0c;日期时间API进行了全面改革&#xff0c;引入了新的java.time包&#xff0c;其中的Loca…

什么是享元模式,有哪些具体应用

一、定义 享元模式是一种通过尽可能多地共享数据来最小化内存使用和对象数量&#xff0c;从而提高性能的设计模式。在享元模式中&#xff0c;如果需要相同数据的多个对象&#xff0c;则共享这些对象而不是创建新的对象&#xff0c;从而提高系统的效率。 其实有很多应用场景&am…

数据库(1)

目录 1.什么是事务&#xff1f;事务的基本特性ACID&#xff1f; 2.数据库中并发一致性问题&#xff1f; 3.数据的隔离等级&#xff1f; 4.ACID靠什么保证的呢&#xff1f; 5.SQL优化的实践经验&#xff1f; 1.什么是事务&#xff1f;事务的基本特性ACID&#xff1f; 事务指…

kotlin基础学习教程以及代码案例

基础概念和知识点&#xff1a; Kotlin的基础语法涵盖了许多重要的知识点&#xff0c;以下是其中的一些核心要素&#xff1a; 变量与常量&#xff1a; var 关键字用于声明可变的变量。val 关键字用于声明只读的变量&#xff0c;即常量。const val 用于编译时常量&#xff0c;只…

Alibaba --- 如何写好 Prompt ?

如何写好 Prompt 提示工程&#xff08;Prompt Engineering&#xff09;是一项通过优化提示词&#xff08;Prompt&#xff09;和生成策略&#xff0c;从而获得更好的模型返回结果的工程技术。总体而言&#xff0c;其实现逻辑如下&#xff1a; &#xff08;注&#xff1a;示例图…

Kotlin - 时间 Duration

一、概念 用于表示时间度量&#xff0c;简化了时间单位的换算、计算时间差、操作间隔、比较等场景。 二、使用 2.1 创建 2.1.1 Number -> Duration 扩展函数适用于 Int、Long、Double。Duration 可以是正、负、零、正无穷大或负无穷大。 nanosecondspublic inline val Int…

napi系列学习进阶篇——NAPI异步调用

简介 OpenHarmony Napi 标准系统异步接口实现支持Callback方式和Promise方式。标准系统异步接口实现规范要求&#xff0c;若引擎开启Promise特性支持&#xff0c;则异步方法必须同时支持Callback方式和Promise方式。使用哪种方式由应用开发者决定&#xff0c;通过是否传递Call…

SpringMVC--获取请求参数 / 域对象共享数据

目录 1. SpringMVC 获取请求参数 1.1. 通过ServletAPI获取 1.2. 控制器方法形参获取 1.3. RequestParam 1.4. RequestHeader 1.5. CookieValue 1.6. 通过POJO获取请求参数 1.7. 解决获取请求参数的乱码问题 2. 域对象共享数据 2.1. 三大域对象 2.2. 准备工作 2.3. S…