【LeetCode】No.70. Climbing Stairs -- Java Version

news2024/10/7 20:35:03

题目链接:https://leetcode.com/problems/climbing-stairs/

1. 题目介绍(Climbing Stairs)

You are climbing a staircase. It takes n steps to reach the top.

【Translate】: 你正在爬楼梯,爬到山顶要走n步。

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

【Translate】: 每次你可以爬1或2级台阶,你可以用多少种不同的方式爬到顶?

【测试用例】:

testcase

【条件约束】:

Constraint

2. 题解

climbing stairs
爬上n阶台阶有两种情况:从第n-1阶台阶往上爬,或者是从n-2阶台阶网上爬。那么爬上n-1阶台阶也有两种情况:从n-2阶台阶往上爬1个台阶,或者是从n-3阶台阶往上再爬2阶。以此类推。

因此我们可以写出递推公式,f(n)是爬上n阶台阶的方法数。
strict test

2.1 纯递归

原题解来自于maxlivinci的Java from Recursion to DP。题解代码如下:

/**
 * Recustion (Top Down Approach) 自顶向下
 * Question   : Climbing Stairs
 * Complexity : Time: O(2^n) ; Space: O(n)
 */
class Solution {
    public int climbStairs(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        return climbStairs(n - 1) + climbStairs(n - 2);
    }
}

该方法属于完全按照递推公式进行,不进行其它任何操作,简单易懂,但时间复杂度过大,无法通过AC。
act1

2.2 递归 + Map (记忆化搜索)

本质上还是递归的思想,但由于递归解法重复的计算,我们可以把之前计算过的数值保存到Map键值对中,这样可以有效避免重复。

/**
 * Recustion + Memorization (Top Down Approach)
 * Question   : Climbing Stairs
 * Complexity : Time: O(n) ; Space: O(n)
 */
class Solution {
    public int climbStairs(int n) {
        Map<Integer, Integer> memo = new HashMap<>();
        memo.put(1, 1);
        memo.put(2, 2);
        return climbStairs(n, memo);
    }

    private int climbStairs(int n, Map<Integer, Integer> memo) {
        if (memo.containsKey(n)) {
            return memo.get(n);
        }
        memo.put(n, climbStairs(n - 1, memo) + climbStairs(n - 2, memo));
        return memo.get(n);
    }
}

act2

2.3 动态规划

动态规划法在求解子问题时,会保存该子问题的解,后面的子问题求解时,可以直接拿来计算,这无疑是要比递归的效率高上很多。

/**
 * DP (Bottom Up Approach)
 * Question   : Climbing Stairs
 * Complexity : Time: O(n) ; Space: O(n)
 */
class Solution {
    public int climbStairs(int n) {
        if (n <= 1) {
            return 1;
        }
        
        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];
    }
}

act3

2.4 动态规划 + 最优化

为了计算新的值,我们只利用前两个值。因此,我们不需要使用数组来存储之前的所有值。

/**
 * DP + Optimization (Bottom Up Approach)
 * Question   : Climbing Stairs
 * Complexity : Time: O(n) ; Space: O(1)
 */
class Solution {
    public int climbStairs(int n) {
        if (n <= 1) {
            return 1;
        }

        int prev1 = 1;
        int prev2 = 2;

        for (int i = 3; i <= n; i++) {
            int newValue = prev1 + prev2;
            prev1 = prev2;
            prev2 = newValue;
        }

        return prev2;
    }
}

act4

3. 参考资料

[1] 70. Climbing Stairs | CSDN
[2] 五大基础算法–动态规划法 | 华为云

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

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

相关文章

最受欢迎的职业榜单!医生还是程序员?

最受欢迎的男友职业排行榜终于更新了&#xff0c;医生荣归榜首成为了第一名。 出人意外的是&#xff0c;公务员竟然只排名第六。 榜单上可以看出程序员也霸榜&#xff0c;占据了排行前三的位置。 程序员相对于医生有什么样的优势呢&#xff1f; 首先是逻辑分析能力。 虽然医生…

CMSC5707-高级人工智能之自编码器Auto-encoders

这章讲述模型框架和概念的时间较多&#xff0c;好像并没有涉及过多的运算&#xff0c;重在一些概念的理解。 Traditional Autoencoder 传统的自编码器常用来进行图像去噪的任务&#xff0c;需要了解其模型架构和流程。 自编码器由两部分组成&#xff1a;从Noisy Input到Z称为…

【附源码】计算机毕业设计java学生社团管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python Flask教程学习02

书接上文Python Flask教程学习01 文章目录Flask 教程Flask 会话Flask 消息闪现Flask 文件上传Flask 扩展/寻找扩展Flask 教程 Flask 会话 与Cookie不同&#xff0c;Session&#xff08;会话&#xff09;数据存储在服务器上。会话是客户端登录到服务器并注销服务器的时间间隔。…

jmap:java内存映像工具【详细】

目录jmap概述&#xff1a;jmap 命令格式jmap -heap mid-histo[:live] midjmap -finalizerinfo midjamp -dump:[live,] formatb,filejmap概述&#xff1a; jmap命令用于生成堆转储快照j。jmap的作用不仅仅是为了获取dump文件&#xff0c;它还可以查询finalize执行对垒、java堆和…

【转】推送消息推送机制

原文链接&#xff1a;推送消息&推送机制 - 知乎 消息推送&#xff08;push&#xff09;用一句话解释就是&#xff1a;服务端向客户端发送了一条消息&#xff0c;我们在通知栏、锁屏通知、微信消息等等之类的都是消息推送。 1/推送类型有哪些&#xff1f; 消息推送根据业…

2017年某高校848数据结构真题复习

数据是对客观事物的符号表示 元素之间的关系不同&#xff0c;通常由四类基本结构————集合&#xff0c;线性结构&#xff0c;树形结构&#xff0c;图状结构 算法的五个特性——出入确可穷 1个或多个输出0个或多个输入确定性可行性有穷性求下列程序段的时间复杂度 for(i1…

html制作一个酷炫的记事本(源码)

文章目录1.记事本风格和灵感1.1 设计灵感1.2 整体风格2.代码展示1.1 酷炫的记事本效果图1.2 主代码源码下载html制作一个酷炫的记事本&#xff08;源码&#xff09; 平时上班总有很多事要弄&#xff0c;到了下班以为都弄好了&#xff0c;结果缺忘记了几个。于是整了一个便签记事…

是德/安捷伦E5062A网络分析仪的常用技术及性能参数

网络分析仪作为一种测量网络参数的新型测试测量的仪器&#xff0c;直接测量有源或无源、可逆或不可逆的双口和单口网络的复数散射参数&#xff0c;以扫频方式输出各散射参数的幅度、相位频率特性&#xff0c;以供进行信号比较和再次利用&#xff0c;随着科技的发展&#xff0c;…

2.1.5操作系统之线程概念与多线程模型

文章目录为什么要引入线程什么是线程引入线程带来的变化及进程与线程的比较线程的属性线程的实现方式用户线程内核线程特殊的组合方式及重点注意多线程模型多对一模型一对一模型多对多模型为什么要引入线程 引入进程是为了让程序能够并发的执行&#xff0c;因为进程只能而引入线…

python每日学4:vscode的安装与基础使用

python开发常用的编辑器就是vscode, pycharm, 其他文本编辑器&#xff0c;我以前一直使用pycharm和国产的everedit. 但是&#xff0c;pycharm有点太笨重&#xff0c;everedit又太轻了&#xff0c;编译时经常出现字符编码集的错误&#xff0c;于是我就想换着使用下vscode. 首先是…

FLINK 基于1.15.2的Java开发-Watermark是怎么解决延迟数据唯一正确的生产级解决方案-目前市面上的例子都有问题

至此篇&#xff0c;已经完成高级生产应用&#xff0c;至此只剩“码需求”了。 开篇 Watermark这一块国内中文相关资料没有一篇是写完整或者写对的。源于&#xff1a;官网的watermark理论是对的&#xff0c;中文相关博客的代码和公式是错的。 很有可能是写第一篇Watermark中文…

【模电实验】【验证性实验——基本差动放大电路实验】

实验4-1 验证性实验——基本差动放大电路实验 1. 静态工作点的测试 按照下图连接电路&#xff0c;检查无误后将A, B两端短接&#xff0c;接通电源12 V&#xff0c; 分别测量三极管各极对地的电压值&#xff0c;推算静态电流&#xff0c;记入下表&#xff0c;并与仿真结果&…

【JavaWeb】之富文本编辑器

【JavaWeb】富文本编辑器前言一、富文本编辑器介绍二、富文本编辑器使用1.引入编辑器&#xff08;多种引入方式&#xff09;2.使用编辑器三、主流富文本编辑器推荐1.TinyMCE2.CKEditor3.UEditor4.wangEditor5.kindeditor6.simditor7.bootstrap-wysiwyg8.summernote9.Froala10.Q…

C++ Reference: Standard C++ Library reference: C Library: cstdlib: wctomb

C官网参考链接&#xff1a;https://cplusplus.com/reference/cstdlib/wctomb/ 函数 <cstdlib> wctomb int wctomb (char* pmb, wchar_t wc); 宽字符wc被转换为其等效多字节&#xff0c;并存储在pmb指向的数组中。函数在调用后返回由pmb指向的等效多字节序列的字节长度。…

倡议“1024区块链活动日”第三系列活动在京主会场和全球21个分会场成功举办

10月24日下午&#xff0c;倡议“1024区块链活动日”第三次系列活动暨乡村产业链改大会乡村振兴链改助农大会通过线上的形式&#xff0c;在北京主会场和全球21个分会场&#xff0c;1024个视频直播节点联动成功举办&#xff0c;本次活动由中国通信工业协会区块链专业委员会&#…

关于蓝桥杯单片机组自学的经验分享

这篇文章主题如标题所示。先说一下经验分享&#xff0c;文章末再写一些碎碎念。 蓝桥杯单片机组 客观题 程序设计题 数模电 C语言 单片机。 先说第一个等式&#xff0c;是从考题结构看的&#xff0c;程序设计题只要好好练&#xff0c;基本都能实…

SpringBoot常用注解

文章目录组件添加SpringBootApplicationConfigurationBeanConditionImprotImportSelectorImportBeanDefinitionRegistrar原生配置文件引入ImportResource配置绑定Component ConfigurationPropertiesConfigurationProperties EnableConfigurationProperties自动配置原理入门引…

SCI论文降重技巧盘点 - 易智编译EaseEditing

要想顺利发布SCI论文&#xff0c;首先就是要保证论文的原创性和创新性。要知道论文写作当中对于文献和资料的引用是必不可少的&#xff0c;所以论文的重复率很有可能会超标&#xff0c;对于这点要留意。 免费的查重网站有PaperYY、百度学术查重、Freecheck、Paperpass等等&…

上市公司信息透明度数据(1991-2019年)包含stata源代码和数据

上市公司信息透明度数据&#xff08;1991-2019年&#xff09;包含stata源代码和数据 1、数据来源&#xff1a;附在文件内 2、时间跨度&#xff1a;1991-2019年 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 股价同步性&#xff08;SYNCH&#xff09;&#xff0c;S…