【第37天】斐波那契数列与爬楼梯 | 迭代的鼻祖,递推与记忆化

news2025/3/14 18:33:41
本文已收录于专栏
🌸《Java入门一百例》🌸

学习指引

  • 序、专栏前言
  • 一、递推与记忆化
  • 二、【例题1】
    • 1、题目描述
    • 2、解题思路
    • 3、模板代码
    • 4、代码解析
    • 5.原题链接
  • 三、【例题1】
    • 1、题目描述
    • 2.解题思路
    • 3、模板代码
    • 4、代码解析
    • 5、原题链接
  • 三、推荐专栏
  • 四、课后习题

序、专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Java,特别是一些Java学习者难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
   但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
   算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
  学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。

一、递推与记忆化

  在算法的学习中,有许多的题目需要我们递推得到答案,这需要我们去发掘出递推式子得到答案。就好比我们在一个有向图上想要到达终点,需要从起点一步步找到终点,所以相邻的点之间一定会有着某种关联,这种关联就是我们的递推式。斐波那契数列和爬楼梯两道题可以说是所有递推入门的经典题目,同时递推思想也可以看作是最简单动态规划思想。当然在递推时,为了减少重复计算,我们还用叫做记忆化的优化方法,可以帮我们节省大量的时间。

二、【例题1】

1、题目描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

  • F(0) = 0, F(1) = 1
  • F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
  • 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

2、解题思路

  核心在于递推式: F ( N ) = F ( N − 1 ) + F ( N − 2 ) F(N) = F(N - 1) + F(N - 2) F(N)=F(N1)+F(N2)

  显然式子含义为每个数为前两个数之和,我们根据式子递推即可。

3、模板代码

超时代码:

class Solution {
    public int fib(int n) {
        return f(n);
    }
    int f(int x){
        if(x==1) return 1;
        if(x==0) return 0;
        return (f(x-1)+f(x-2))%1000000007;
    }
}

递归记忆化代码:

class Solution {
    int[] a=new int[110];
    public int fib(int n) {
        Arrays.fill(a,-1);
        a[0]=0;
        a[1]=1;
        dfs(n);
        return a[n];
    }
    int dfs(int x){
        if(a[x]!=-1) return a[x];
        return a[x]=(dfs(x-1)+dfs(x-2))%1000000007;
    }
}

递推代码:

class Solution {
    public int fib(int n) {
        if(n==0) return 0;
        int[] f=new int[n+1];
        f[0]=0;
        f[1]=1;
        for(int i=2;i<=n;++i){
            f[i]=(f[i-1]+f[i-2])%1000000007;
        }
        return f[n];
    }
}

4、代码解析

  显然,无论是递推还是记忆化代码,我们都需要使用数组记录答案,否则当我们求解 f ( n ) f(n) f(n)时,本来我们已经计算出了 f ( n − 1 ) f(n-1) f(n1) f ( n − 2 ) f(n-2) f(n2),结果又得重新计算一次,从而导致计算量变大超时。可以直接使用数组递推时,其本身就有记忆化功能,如果使用递归来进行 d p dp dp,则大家最好加上记忆化。

5.原题链接

斐波那契数列

三、【例题1】

1、题目描述

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

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

2.解题思路

  定义 f ( n ) f(n) f(n)为走到第 n n n 阶楼梯有多少种走法,显然第 n n n 阶只能从第 n − 1 n-1 n1 或者 n − 2 n-2 n2 阶走过来,于是我们得到递推式:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n - 1) + f(n - 2) f(n)=f(n1)+f(n2)
  (惊喜发现这不是和斐波那契数列一样的吗哈哈哈,那么题目迎刃而解啦,但是注意初始化有略微区别

3、模板代码

递推代码:

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

递推记忆化代码:

class Solution {
    int[] f=new int[50];
    public int climbStairs(int n) {
        Arrays.fill(f,-1);
        if(n==1) return 1;
        f[1]=1;
        f[2]=2;
        dfs(n);
        return f[n];
    }
    int dfs(int x){
        if(f[x]!=-1) return f[x];
        return f[x]=dfs(x-1)+dfs(x-2);
    }
}

4、代码解析

注意到爬楼梯和斐波那契初始化不同,递推式相同。

5、原题链接

爬楼梯
在这里插入图片描述

三、推荐专栏

🌌《零基础学算法100天》🌌

四、课后习题

序号题目链接难度评级
1 使用最小花费爬楼梯1
👇 学习有疑问?👇

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

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

相关文章

数据库原理及应用基础知识点

数据库原理基础知识点大全数据库原理及应用1、数据库系统概述1.1 基本概念1.2 数据模型1.3 数据库系统的结构2、实体 -- 联系模型2.1 基本概念2.2 实体-联系图2.3 弱实体集3、关系数据模型3.1 关系数据库的结构3.2 从ER模型到关系模型3.3 关系操作、完整性约束、关系代数4、关系…

Nacos安装配置(二)

目录 一、概述 二、Nacos 安装 A&#xff09;Debian11 1&#xff09;软件环境 2&#xff09;下载源码或者安装包 3&#xff09;mysql配置 4&#xff09;启动服务器 B) Debian11 1) 安装JDK 2) 安装Maven 3) 安装Nacos2 4) 修改访问参数&#xff08;/conf/applicati…

GEE:下载研究区同一天的Landsat影像

本文记录了下载Landsat逐日数据的代码,包装成了函数。直接输入数据集合就可以直接使用。 并在下文中应用了该函数,以下载2022年逐日地表温度LST数据,和下载研究区多波段影像为例。 结果如图所示 文章目录 一、调用方法二、Landsat 逐日下载函数三、应用示例1——下载2022年研…

RNN循环神经网络原理理解

一、基础 正常的神经网络 一般情况下&#xff0c;输入层提供数据&#xff0c;全连接进入隐藏层&#xff0c;隐藏层可以是多层&#xff0c;层与层之间是全连接&#xff0c;最后输出到输出层&#xff1b;通过不断的调整权重参数和偏置参数实现训练的效果。深度学习的网络都是水…

【安全知识】——对Linux密码文件的处理

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 一切为了她座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日emo&#xff1a;他既乐观又悲观&#xff0c;生活也一无是处昨天在挖掘…

mycat2使用

安装部署下载1&#xff1a;mycat2-install-template-1.21.zip下载2&#xff1a;mycat2-1.21-release-jar-with-dependencies.jar解压mycat2-install-template-1.21.zipunzip mycat2-install-template-1.21.zip把mycat2-1.21-release-jar-with-dependencies.jar放在mycat/lib中修…

神码ospfv3配置.docx

一.配置各设备的ip地址 sw1(config)#ipv6 enable sw1(config)#vlan 1000 sw1(config-vlan1000)#swi int eth1/0/3 Set the port Ethernet1/0/3 access vlan 1000 successfully sw1(config)#int vlan 1000 sw1(config-if-vlan1000)#ipv6 address aa::aa/64 sw1(config-if-vla…

分享微信商城小程序搭建步骤_微信公众号商城小程序怎么做

如何搭建好一个微信商城&#xff1f;这三个功能要会用&#xff01; 1.定期低价秒杀&#xff0c;提高商城流量 除了通过私域流量裂变&#xff0c;低价秒杀是为商城引流提高打开率的良好手段。 以不同节日作为嘘头&#xff0c;在情人节、38妇女节、中秋国庆、七夕节等日子&…

Node=>Express中间件 学习3

1.概念&#xff1a; 例&#xff1a;在处理污水的时候&#xff0c;一般都要经过三个处理环节&#xff0c;从而保证处理过后的废水&#xff0c;达到排放标准 处理污水的这三个中间处理环节&#xff0c;就可以叫中间件 2.中间件调用流程 当一个请求到达Express的服务器之后&#x…

大数据---Hadoop安装jdk简易版

编写自动安装的shell脚本 完整流程: 大数据—Hadoop安装教程&#xff08;一&#xff09; 文章目录编写自动安装的shell脚本上传压缩包编写shell脚本vim autoinstall.sh解压更名添加环境运行上传压缩包 在opt目录下创建连个目录install和soft 将压缩包上传到install目录下 …

Google杀入AI聊天机器人领域,暴跌千亿?错哪了?

大家好&#xff0c;ChatGPT 现在被大家玩坏了&#xff0c;甚至在用户的不断逼问之下&#xff0c;露出了鸡脚&#xff0c;原来 ChatGPT 也是小黑子ChatGPT 太火了&#xff0c;火的谷歌都坐不住了。为了应对爆火的ChatGPT&#xff0c;谷歌推出的Bard&#xff0c;但是谷歌翻车了&a…

Python Web 框架要点

Python Web 框架要点 1. Web应用程序处理流程 2. Web程序框架的意义 用于搭建Web应用程序免去不同Web应用相同代码部分的重复编写&#xff0c;只需关心Web应用核心的业务逻辑实现 3. Web应用程序的本质 接收并解析HTTP请求&#xff0c;获取具体的请求信息处理本次HTTP请求&a…

三大基础排序算法——冒泡排序、选择排序、插入排序

目录前言一、排序简介二、冒泡排序三、选择排序四、插入排序五、对比References前言 在此之前&#xff0c;我们已经介绍了十大排序算法中的&#xff1a;归并排序、快速排序、堆排序&#xff08;还不知道的小伙伴们可以参考我的 「数据结构与算法」 专栏&#xff09;&#xff0…

【内网安全】——数据库提权姿势

作者名&#xff1a;白昼安全主页面链接&#xff1a;主页传送门创作初心&#xff1a; 一切为了她座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日emo&#xff1a; 在哪能找到解救我的办法模拟环境我们拿到了一个普通用…

java开发-用户注册-MD5工具加密密码

加密方式介绍 对称加密&#xff1a;加密和解密使用的相同的密钥&#xff0c;常见的对称加密算法有:DES、3DES非对称加密&#xff1a;加密和解密使用的密钥不同&#xff0c;常见的非对称加密算法有:RSA 加密&#xff1a;使用私钥加密解密&#xff1a;使用公钥解密 消息摘要: 消…

vcs仿真教程

VCS是在linux下面用来进行仿真看波形的工具&#xff0c;类似于windows下面的modelsim以及questasim等工具&#xff0c;以及quartus、vivado仿真的操作。 1.vcs的基本指令 vcs的常见指令后缀 sim常见指令 2.使用vcs的实例 采用的是全加器的官方教程&#xff0c;首先介绍不使用…

Netty(IO模型/零拷贝技术/IO复用之select、poll、epoll模型)

目录 IO模型 阻塞IO和非阻塞IO 阻塞IO 非阻塞IO IO复用模型 异步IO mmap IO复用之select、poll、epoll模型 select poll epoll IO模型 阻塞IO和非阻塞IO 阻塞IO 所谓阻塞IO就是当应用B发起读取数据申请时&#xff0c;在内核数据没有准备好之前&#xff0c;应用…

分享111个JS菜单导航,总有一款适合您

分享111个JS菜单导航&#xff0c;总有一款适合您 111个JS菜单导航下载链接&#xff1a;https://pan.baidu.com/s/1WkrSIyHC5JySwrCTL0sgLA?pwd13yx 提取码&#xff1a;13yx Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "h…

【GPLT 二阶题目集】L2-036 网红点打卡攻略

一个旅游景点&#xff0c;如果被带火了的话&#xff0c;就被称为“网红点”。大家来网红点游玩&#xff0c;俗称“打卡”。在各个网红点打卡的快&#xff08;省&#xff09;乐&#xff08;钱&#xff09;方法称为“攻略”。你的任务就是从一大堆攻略中&#xff0c;找出那个能在…

开源ChatGPT要来了;软件2.0智能革命;GLM、Diffusion模型大加速

1. 2023年AI十大展望&#xff1a;GPT-4领衔大模型变革&#xff0c;谷歌拉响警报&#xff0c;训练数据告急 新年伊始&#xff0c;大模型的话题热度不减。ChatGPT展现的惊人能力将大模型研究和应用热度推向高潮&#xff0c;人们激烈讨论着这个高级“物种”的推出意味着什么。 本文…