备战秋招60天算法挑战,Day28

news2024/9/21 9:50:44

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

视频题解: https://www.bilibili.com/video/BV1h1421t7W3/

LeetCode 70.爬楼梯

题目描述

假设你正在爬楼梯。需要n阶你才能到达楼顶。
每次你可以爬12个台阶。你有多少种不同的方法可以爬到楼顶呢?

举个例子:

输入: n = 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1阶 + 1阶
2. 2阶

视频题解

爬楼梯

思路来源

思路来源

知识回顾

动态规划是一种通过将原问题分解为子问题来求解复杂问题的算法思想。它通常用于求解最优化问题,例如最长公共子序列、背包问题等。动态规划的核心思想是将原问题分解为若干个子问题,通过求解子问题的最优解推导出原问题的最优解。可以通过两点来判断一个问题能不能通过动态规划来解,一是该问题是否存在递归结构,二是对应的子问题能否记忆化。动态规划可以通过带备忘录的自上而下的递归自下而上的迭代来分别实现。由于递归需要用到栈来实现,一些语言对递归的深度是有限制的,所以自下而上的迭代是动态规划的最佳实现方式

思路解析

假设只有4个台阶,0阶代表地面。

整个爬楼梯的过程对应的决策树可以表示成下图:

每个节点的值表示剩余的台阶数,从根节点到叶子结点组成的路径代表一种爬楼梯的方法。

整个决策树存在递归结构,还存在重复子问题两个节点2三个节点1,这些子问题计算一次后可以直接保存下来,避免多次重复计算。这就满足了使用动态规划的条件:存在递归结构子问题可以记忆化。所以本题可以用动态规划来解,动态规划的两个核心点是推导状态转移公式边界处理

定义dp[i]i个台阶对应的爬楼梯的方法个数dp[i]的准确定义是推导状态转移公式的关键。

因为每次只能爬12个台阶,从上面的图可以看出4个台阶的爬楼梯方法可以拆解成32个台阶爬楼梯方法之和。说白了就是节点4到叶子节点0的所有路径等于节点3节点2到叶子节点路径的总和。
d p [ 4 ] = d p [ 3 ] + d p [ 2 ] dp[4] = dp[3] + dp[2] dp[4]=dp[3]+dp[2]

4个台阶进一步扩展到n个台阶,我们得到下面的状态转移公式
d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] , 1 < i < = n dp[i] = dp[i-1] + dp[i-2], 1 < i <= n dp[i]=dp[i1]+dp[i2],1<i<=n

接下来进行边界处理,根据上面的公式可知 d p [ 2 ] = d p [ 1 ] + d p [ 0 ] dp[2] = dp[1] + dp[0] dp[2]=dp[1]+dp[0],很显然dp[1] = 1dp[2] = 2,上面也说到0阶代表地面,为了写代码方便这里我们定义dp[0] = 1

C++代码

class Solution {
public:
    int climbStairs(int n) {
        //因为有n阶台阶,台阶从0开始计算,所以定义n+1个元素
        vector<int> dp(n+1, 0);
        //定义边界dp[0]=1
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; ++i) {
            //状态转移公式
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

java代码

class Solution {
    public int climbStairs(int n) {
        // 因为有n阶台阶,台阶从0开始计算,所以定义n+1个元素
        int[] dp = new int[n + 1];
        // 定义边界dp[0]=1
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; ++i) {
            // 状态转移公式
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
}

python代码

class Solution:
    def climbStairs(self, n: int) -> int:
        # 因为有n阶台阶,台阶从0开始计算,所以定义n+1个元素
        dp = [0] * (n + 1)
        # 定义边界dp[0]=1
        dp[0] = 1
        dp[1] = 1
        for i in range(2, n + 1):
            # 状态转移公式
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

上面的代码实现使用了一个长为n+1dp数组,我们观察状态转移公式的规律,其实并不需要保存每个台阶数为i的爬楼梯方法,可以通过两个整型变量来优化上面的实现。

c++代码

class Solution {
public:
    int climbStairs(int n) {
        int pre = 1;
        int next = 1;
        for (int i = 2; i <= n; ++i) {
            int temp = next;
            next = pre + next;
            pre = temp;
        }
        return next;
    }
};

java代码

class Solution {
    public int climbStairs(int n) {
        int pre = 1;
        int next = 1;
        for (int i = 2; i <= n; ++i) {
            int temp = next;
            next = pre + next;
            pre = temp;
        }
        return next;
    }
}

python代码

class Solution:
    def climbStairs(self, n: int) -> int:
        pre = 1
        next = 1
        for i in range(2, n + 1):
            temp = next
            next = pre + next
            pre = temp
        return next

复杂度分析

时间复杂度: 两种实现方式的时间复杂度都是O(n)n为台阶的个数。

空间复杂度: 第一种实现方式的空间复杂度为O(n)n为台阶的个数。第二种实现方式的空间复杂度为O(1)

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

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

相关文章

Nacos2.4.0兼容达梦数据库

这段时间公司在搞国产化&#xff0c;发现当前的nacos版本只支持MySQL和derby数据库&#xff0c;后来翻看官方文档以后&#xff0c;官方文档说2.2以后支持达梦数据库了&#xff0c;但是需要插件。 按照他的思路再结合其他资料&#xff0c;我们开始搞起来&#xff01; 一、下载…

【SpringCloud应用框架】GateWay异步非阻塞模型

Spring Cloud Alibaba 之 GateWay工作流程GateWay搭建 文章目录 一、GateWay工作流程工作流程的核心点总结 二、GateWay搭建 一、GateWay工作流程 流程图如下&#xff1a; 核心概念&#xff1a; 客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请…

2024年世界机器人大会精彩回顾-人形机器人的天下

8 月 25 日&#xff0c; 2024 世界机器人大会在北京北人亦创国际会展中心闭幕。本次大会以“共育新质生产力 共享智能新未来”为主题&#xff0c;同期举办论坛、博览会、大赛及配套活动&#xff0c;机器人创新新品、应用新场景纷纷亮相。 2024 世界机器人大会分为论坛、博览会、…

qml formLayout实现方式

一、背景 我们制作界面时&#xff0c;通常有表单界面需要制作&#xff0c;如下图&#xff1a; 但是Qt5 是没有 formLayout 的&#xff0c;直到Qt6才有&#xff0c;所以现在 qml 使用 TableView 来实现这个样式 二、实现 enum ComponentType {TitleText,Text,Button,Image} …

开放式耳机漏音有多大?解密最值得购买的五大品牌!

​现在的很多开放式耳机漏音情况已经得到很好的控制了&#xff0c;特别是大品牌的耳机。现在耳机市场上&#xff0c;开放式耳机因为外观时尚、戴着舒服&#xff0c;成了大家日常爱用的热门货。但是&#xff0c;市面上的开放式耳机品牌多得眼花缭乱&#xff0c;质量也是高低不一…

如何使用ssm实现基于JAVA的中小型企业财务管理

TOC ssm364基于JAVA的中小型企业财务管理jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)

文章目录 debian12 - openssh-9.6.P1的编译安装(真机 - 联想G480)概述笔记G480上安装debian12配置debian12现在用WindTerm_2.6.0按照telnet方式去连接试试配置debian12中的telnet安装telnet服务查看所有服务当前ssh, telnet状态准备更新openssl3.2和openssh在真机上更新openssl…

Andon安灯系统在汽车零部件工厂起到什么作用?

在当今竞争激烈的汽车市场中&#xff0c;汽车零部件工厂的高效运作和高质量生产至关重要。而 Andon 安灯系统作为一种先进的生产管理工具&#xff0c;在汽车零部件工厂中发挥着举足轻重的作用。 一、Andon安灯系统实时监控生产状态 汽车零部件工厂的生产线通常较为复杂&#x…

Quartz定时任务框架——若依

文章目录 定时任务的执行新增定时任务订单任务状态修改quartz的集群模式 定时任务的执行 新增定时任务 订单任务状态修改 quartz的集群模式 把若依项目中的quartz数据库导入到数据库中然后打开ScheduleConfig配置类复制项目启动&#xff08;记得修改端口&#xff09;&#xff0…

给自己复盘用的tjxt笔记day11第二部分

异步领券 优化方案分析 对于高并发问题&#xff0c;优化的思路有异步写和合并写。 其中&#xff0c;合并写请求比较适合应用在写频率较高&#xff0c;写数据比较简单的场景。而异步写则更适合应用在业务比较复杂&#xff0c;业务链较长的场景。 显然&#xff0c;领券业务更…

【功能自动化】使用测试套件运行测试函数

1.创建registers.py 将registers.py放在文件夹下 registers.py 代码实现 # 导入包 from selenium import webdriver from selenium.webdriver.support.select import Select from time import sleep import unittest import parameterizeddriver None file open(r"us…

ImportError:DLL load failed while importing cv2:找不到指定的模块

用pyinsatller打包好脚本执行后&#xff0c;出现上面的错误&#xff0c;这个错误很明显就是缺少了必需的dll文件&#xff0c;这个网上的资料也比较少&#xff0c;我搜了很久也没找出能解决的方法。 方法1 看官网&#xff1a;https://pypi.org/project/opencv-python/ 拉倒下…

MDS100-16-16-ASEMI三相整流模块MDS100-16

编辑&#xff1a;ll MDS100-16-16-ASEMI三相整流模块MDS100-16 型号&#xff1a;MDS100-16 品牌&#xff1a;ASEMI 封装&#xff1a;M18 批号&#xff1a;2024 类型&#xff1a;整流模块 电流&#xff1a;100A 电压&#xff1a;1600V 安装方式&#xff1a;直插式封装 …

IDEA没有SQL语句提示

解决已经在IDEA连接数据库&#xff0c;但是写SQL语句不会提示列名、属性之类的 Mapper 映射没有 SQL 提示 设置中搜索&#xff0c;把方言改成 MySQL SQL Dialects

Requestium - 将Requests和Selenium合并在一起的自动化测试工具

Requests 是 Python 的第三方库&#xff0c;主要用于发送 http 请求&#xff0c;常用于接口自动化测试等。 Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 本篇介绍一款将 Requests 和 Seleniu…

谷粒商城实战笔记-281-商城业务-订单服务-锁定库存

文章目录 一&#xff0c;锁定库存的基本逻辑二&#xff0c;具体实现 创建订单时&#xff0c;有一个非常重要的步骤&#xff0c;就是锁定库存&#xff0c;或者称之为预占库存。 尽管还没有卖出去&#xff0c;但是因为订单已经创建&#xff0c;所以要确保这个订单对应商品是有库…

最后一波,漂亮、简洁的登录页面模板分享,拿来即用(三)

文章目录 前言一、很有质感的jQuery登录模板二、纯CSS实现的清凉风格的登录三、基于layui的后台管理登录模板四、jQuery个性化登录模板五、带下雪背景的登录注册页面 前言 在做管理系统的时候&#xff0c;有时为了做一个漂亮简洁的登录页面&#xff0c;对应擅长搞后端开发的老…

15行为型设计模式——责任链模式

一、责任链模式简介 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;也叫职责链模式或者职责连锁模式。用于处理请求的多个对象&#xff0c;以实现请求的分发和处理。它的核心思想是将请求的处理职责链式地传递给多个对象…

NRP-Z24功率探头RS/NRP-Z23详情参数NRP-Z21功率传感器

USB 功率传感器&#xff1a; NRP-Z11 频率范围&#xff1a;10 MHz - 8 GHz 功率范围&#xff1a;-67 dBm to 23 dBm. NRP-Z21 频率范围&#xff1a;10 MHz - 18 GHz 功率范围&#xff1a;-67 dBm to 23 dBm. NRP-Z22 频率范围&#xff1a;10 MHz - 18 GHz 功率范围&#xff…

Java:简述类的加载机制-双亲委派

类加载的机制过程分为以下&#xff1a;加载、验证、准备、解析、初始化等。 在第一步的加载环节&#xff0c;Java类加载器有四种&#xff1a;Bootstrap类加载器、Extention 类加载器、Application类加载器、Custom自定义类加载器&#xff0c;其中会涉及“双亲委派”模式。 一…