【动态规划】LeetCode-70.爬楼梯

news2024/11/19 13:14:52

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩
🏠个人主页:Jammingpro
📕专栏链接:算法那些事
🎯每日学习一点点,技术累计看得见

题目

题目描述

假设你正在爬楼梯。需要 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

题解

我们可以逐个分析一下,到达第1阶的方法数有1种,即从开始处走1台阶到达;到达第2阶的方法数有2种,即从开始处走2个台阶到达 或 从第1阶走1个台阶到达;到达第3阶的方法可以是从第1阶走2个台阶到达,也可以是从第2阶走1个台阶到达,因此爬到第3阶的方法数等于爬到第1阶和第2阶的方法数之和…
以此类推,我们可以得到状态转移方程(名字比较高级,其实跟数学里的递推公式差不多)->f(n)=f(n-1)+f(n-2)。也就是说,我们像知道到达第n阶的方法数,知道知道第n-1阶和第n-2阶的方法数即可。上面我们已经得到f(1)=1,f(2)=2,再通过状态转移方程,就可以求出到达其他阶的方法数了。因此,我们可以得到如下代码↓↓↓。

class Solution {
public:
    int climbStairs(int n) {
        if(n == 1) return 1;
        vector<int>dp(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];
    }
};

上面的代码多开辟了一个空间,即dp(n + 1)中的+1,使得下标与台阶号相同,这是解决动规问题的方法之一。如果不+1则是下面代码的样子↓↓↓

class Solution {
public:
    int climbStairs(int n) {
        if(n == 1) return 1;
        vector<int>dp(n);
        dp[0] = 1;
        dp[1] = 2;
        for(int i = 2; i < n; i++)
            dp[i] = dp[i - 1] + dp[i - 2];
        return dp[n - 1];
    }
};

上面的代码的时间复杂度和空间复杂度均为O(N)。我们在计算到达n号台阶的方法数时,只需要n-1号和n-2号台阶的方法数,而不需要n-2号台阶之前的各个台阶的方法数。因此,我们可以使用3个变量cur、pre、ppre来替换dp(n)。
具体是怎么替换的呢?我们使用ppre保存爬到第1个台阶的方法数,使用pre保存爬到第2个台阶的方法数,然后执行cur = pre + ppre,计算出第3个台阶的方法数。再执行ppre = prepre = cur,此时ppre保存的就是爬到第2个台阶的方法数,pre保存的就是爬到第3个台阶对的方法数。此时再执行cur = pre + ppre,就可以计算出爬到第4个台阶的方法数。以此类推…
在这里插入图片描述
我们来看一下,使用3个变量实现的代码吧↓↓↓。这也是动规问题的一大技巧,叫做滚动数组。下面代码使用滚动数组后,空间复杂度将为O(1)。

class Solution {
public:
    int climbStairs(int n) {
        int ppre = 1, pre = 2, cur = 3;
        if(n == 1) return 1;
        if(n == 2) return 2;
        for(int i = 4; i <= n; i++)
        {
            ppre = pre;
            pre = cur;
            cur =ppre + pre;
        }
        return cur;
    }
};

本文存在不足,欢迎留言或私信批评、指正。希望我的解决方法能够对你有所帮助~~
今日打卡完成,点亮小星星☆→★

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

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

相关文章

推荐一款好用的BMP转PNG工具BMP2PNG

推荐一款好用的BMP转PNG工具BMP2PNG 自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用&#xff0c; 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话&#xff0c;网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xf…

ESD静电试验方法及标准

文章目录 概述静电放电抗扰标准静电放电实验室的型式试验静电放电试验配置静电放电试验方法 静电放电等级 参考静电放电发生器&#xff08;ESD&#xff09;试验方法及标准 概述 在低湿度环境下通过摩擦使人体充电的人体在与设备接触时可能会放电&#xff0c;静电放电的后果是&…

虹科分享 | 平衡速度和优先级:为多样化的实时需求打造嵌入式网络(4)——从理论到实践:CANopen源代码配置

正如前文所述&#xff0c;CANopen的适应性在满足实时应用需求方面发挥着至关重要的作用。本系列文章的最后一部分将向您展示 CANopen 源代码配置的技术细节&#xff0c;以及实现高效实时性能的优化方法。 前文回顾&#xff1a; 虹科分享 | 平衡速度和优先级&#xff1a;为多样…

【VUE】el-tab相关问题

Tabs 标签页 分隔内容上有关联但属于不同类别的数据集合。 <template><el-tabs v-model"activeName" tab-click"handleClick"><el-tab-pane label"用户管理" name"first">用户管理</el-tab-pane><el-tab-p…

思维模型 热炉效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。对违规行为零容忍。 1 热炉效应的应用 1.1 热炉效应管理应用-谷歌公司 谷歌公司在员工管理中采用了“热炉效应”的原则。当员工违反公司政策或行为准则时&#xff0c;谷歌会采取严厉的措施…

数据库系统原理——备考计划2:数据库系统的概述

前言&#xff1a; 基于课本、上课ppt、复习总结ppt进行一个知识点的罗列&#xff0c;方便后期高效地复习 目录 前言&#xff1a; 一、基本概念 1.数据&#xff1a; &#xff08;1&#xff09;概念&#xff1a; &#xff08;2&#xff09;数据的种类&#xff1a; &#xff08;3&…

【UE】夜视仪效果

效果 步骤 1. 新创建一个空白项目&#xff0c;勾选“光线追踪”选项 新建一个Open World关卡 添加一个“第一人称游戏”到项目 将角色蓝图放入场景中 设置自动控制玩家 2. 打开第一人称角色蓝图“BP_FirstPersonCharacter”&#xff0c;添加一个后期处理组件&#xff0c;该组件…

运维知识点-SQLServer/mssql

SQLServer/mssql Microsoft structed query language常见注入提权 技术点&#xff1a;0x00 打点前提 0x01 上线CS0x02 提权0x03 转场msf0x04 抓取Hash0x05 清理痕迹 Microsoft structed query language 常见注入 基于联合查询注入 order by 判断列数&#xff08;对应数据类型…

C++二分查找算法:包含每个查询的最小区间

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你一个二维整数数组 intervals &#xff0c;其中 intervals[i] [lefti, righti] 表示第 i 个区间开始于 lefti 、结束于 righti&#xff08;包含两侧取值&a…

【Lustre相关】应用部署-03-Lustre集群部署实践(软raid方案)

文章目录 一、前言1、硬件配置2、组网拓扑3、总体方案 二、软件安装三、集群部署1、配置多路径2、配置高可用集群3、配置zpool4、部署lustre5、配置Lustre角色高可用6、配置Lustre状态监控6.1、Lustre网络状态监控6.2、Lustre集群状态监控6.3、配置优化6.3.1、设置故障恢复不回…

7Docker搭建es和kibana

一、安装es 1.拉取镜像 sudo docker pull elasticsearch:7.12.0 elasticsearch:7.12.0:我安装的版本是7.12.0&#xff0c;可以根据实际的情况安装 创建docker容器挂在的目录&#xff1a; sudo mkdir -p /opt/elasticsearch/config sudo mkdir -p /opt/elasticsearch/data s…

TA-Lib学习研究笔记——Overlap Studies(二)上

TA-Lib学习研究笔记——Overlap Studies&#xff08;二&#xff09; 1. Overlap Studies 指标 [BBANDS, DEMA, EMA, HT_TRENDLINE, KAMA, MA, MAMA, MAVP, MIDPOINT, MIDPRICE, SAR, SAREXT, SMA, T3, TEMA, TRIMA, WMA]2.数据准备 get_data函数参数&#xff08;代码&#x…

沿着马可·波罗的足迹,看数字云南

刚入行的时候&#xff0c;有位前辈跟我说过一句话&#xff1a;去现场“要像外国人一样去看”&#xff0c;重新审视那些自己可能早已“熟视无睹”的事物。 前不久&#xff0c;我跟随“看见数字云南——云南数字经济媒体探营活动”&#xff0c;奔赴昆明、大理、西双版纳等地&…

springmvc(基础学习整合)

SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块。 在SpringMVC的各个组件中&#xff0c;处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 springMVC基本介绍&#xff1a; http://t.csdnimg.cn/TOzw9 MVC是一种设计思想&#xff0c;将一个应…

基于ssm的汽车论坛管理系统设计与实现

基于ssm的汽车论坛管理系统设计与实现 摘要&#xff1a;信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题…

WordPress 粘贴图片上传插件

找了很久&#xff0c;发现一款不错的插件&#xff0c;允许我们直接粘贴图片文件并且上传到媒体库。以前的插件上传后媒体库不会显示&#xff0c;这个要显示。 启用后编辑器会有一个图标&#xff0c;如果开启&#xff0c;那么久可以截图后直接粘贴了。 学习资料源代码&#xf…

每日一题:LeetCode-283. 移动零

每日一题系列&#xff08;day 08&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

Django大回顾 -3 之响应对象、cbv和fbv、关于类中self是谁的问题、上传文件、模版

【1】isinstance方法 判断一个对象是否是一个已知的类型。 isinstance语法&#xff1a; isinstance(object&#xff0c;classinfo) object --------- 实例化对象 cassinfo ------- 可以是字节或间接类名、基本类型&#xff0c;或者由他们组成的元组 相同返回True&#xff0c;不…

数据挖掘 感知机

要使用感知机&#xff0c;我们首先要引入头文件&#xff0c;以下是感知机用的到头文件&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Perceptron from sklearn.model_selection import train_test_…

【刷题】树的遍历

层序遍历 层序遍历需要用到广度有限搜索&#xff0c;也就是需要队列 1.将根节点加入队列、 2.如果队列不为空&#xff0c;就得到队列的长度&#xff0c;对队列中现有的元素进行访问并从队列中删除&#xff0c;并将其子节点加入到队列中 102. 二叉树的层序遍历 给你二叉树的根…