每日一题-斐波那契数列和跳台阶

斐波那契数列和跳台阶

    • 斐波那契数列
      • 题目描述
        • 斐波那契数列的定义:
        • 数据范围:
        • 题目要求:
      • 输入描述:
      • 输出描述:
      • 示例
        • 示例 1:
        • 示例 2:
        • 示例 3:
      • 解法
        • 1. 递归解法
          • 代码解释:
        • 2. 动态规划解法(自底向上)
          • 代码解释:
    • 跳台阶问题
      • 题目描述
      • 示例
        • 示例1
        • 示例2
      • 解题思路
        • 方法一:递归
        • 方法二:动态规划
      • 总结

斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

斐波那契数列的定义:
  • $ \text{fib}(x) = 1 \quad \text{(x = 1 or x = 2)} $
  • $ \text{fib}(x) = \text{fib}(x-1) + \text{fib}(x-2) \quad \text{(x > 2)} $
数据范围:

$ 1 \leq n \leq 40 $

题目要求:
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 时间复杂度: O ( n ) O(n) O(n),但是也可以使用 O ( log ⁡ n ) O(\log n) O(logn) 的解法。

输入描述:

一个正整数 n


输出描述:

输出斐波那契数列的第 n 项。


示例

示例 1:

输入:

4

输出:

3

说明
根据斐波那契数列的定义可知,fib(1)=1fib(2)=1fib(3)=fib(3-1)+fib(3-2)=2fib(4)=fib(4-1)+fib(4-2)=3,所以答案为 3。

示例 2:

输入:

1

输出:

1
示例 3:

输入:

2

输出:

1

解法

1. 递归解法

递归的做法是基于斐波那契数列的定义,逐步向下调用。时间复杂度是 O( 2 n 2^n 2n),并且会大量重复计算,所以效率较低。

int Fibonacci(int n) {if (n <= 2)return 1;else return Fibonacci(n - 1) + Fibonacci(n - 2);
}
代码解释:
  • if (n <= 2): 递归的终止条件,当 n 为 1 或 2 时,返回 1。
  • else return Fibonacci(n - 1) + Fibonacci(n - 2): 如果 n 大于 2,则根据斐波那契数列的定义,递归计算 fib(n-1)fib(n-2),并返回它们的和。
2. 动态规划解法(自底向上)

为了解决递归解法中重复计算的问题,我们可以使用动态规划的方式来从底到顶逐步计算每一项斐波那契数,并记录下来,避免重复计算。

int Fibonacci(int n) {if (n <= 2) return 1;int prev1 = 1, prev2 = 1, current;for (int i = 3; i <= n; ++i) {current = prev1 + prev2;prev2 = prev1;prev1 = current;}return current;
}
代码解释:
  • if (n <= 2) return 1;: 若 n 为 1 或 2,直接返回 1。
  • int prev1 = 1, prev2 = 1, current;: 使用三个变量 prev1prev2current 来保存斐波那契数列的前两项和当前项。
  • for (int i = 3; i <= n; ++i): 从第三项开始循环计算,逐步得到下一个斐波那契数。
  • current = prev1 + prev2;: 当前项是前两项的和。
  • prev2 = prev1; prev1 = current;: 更新 prev1prev2 为当前项和前两项。

跳台阶问题

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

数据范围:
1 ≤ n ≤ 40

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


示例

示例1

输入:
2
返回值:
2
说明:
青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。因此答案为2。

示例2

输入:
7
返回值:
21


解题思路

方法一:递归

递归的思路是,青蛙跳上第n级台阶的跳法等于跳上第n-1级台阶的跳法加上跳上第n-2级台阶的跳法。即:

f(n) = f(n-1) + f(n-2)

代码实现:

#include <stdio.h>int jumpFloor(int number) {if (number == 0 || number == 1) {return 1;} else {return jumpFloor(number - 1) + jumpFloor(number - 2);}
}

时间复杂度:
O(2^n),因为每次递归调用会产生两个新的递归调用,导致指数级的时间复杂度。

空间复杂度:
O(n),递归调用栈的深度为n。

方法二:动态规划

为了优化递归方法的时间复杂度,我们可以使用动态规划来避免重复计算。通过保存中间结果,可以将时间复杂度降低到O(n)。

代码实现:

#include <stdio.h>int jumpFloor(int number) {int a = 1;int b = 1;int c = 1;if (number == 0 || number == 1) {return 1;}for (int i = 1; i < number; i++) {a = b;b = c;c = a + b;}return c;
}

时间复杂度:
O(n),只需要遍历一次即可计算出结果。

空间复杂度:
O(1),只使用了常数个额外空间。


总结

  • 递归方法 简单直观,但时间复杂度较高,适合小规模问题。
  • 动态规划方法 通过保存中间结果,大大降低了时间复杂度,适合大规模问题。

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

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

相关文章

MySQL 联合索引的最左匹配原则

环境&#xff1a;MySQL 版本&#xff1a;8.0.27 执行计划基础知识 possible_keys&#xff1a;可能用到的索引 key&#xff1a;实际用到的索引 type: ref&#xff1a;当通过普通的二级索引列与常量进行等值匹配的方式 询某个表时const&#xff1a;当我们根据主键或者唯一得…

算法07-滑动窗⼝算法

滑动窗口算法&#xff08;Sliding Window&#xff09; 一、详细讲解 A、一句话总结 滑动窗口算法是一种通过维护一个动态窗口来解决问题的技巧&#xff0c;窗口在数据上“滑动”&#xff0c;逐步找到最优解。 B、核心思想 想象你在看一列火车&#xff0c;火车窗口只能看到一…

docker安装mongo,导入、导出数据

1、docker安装mongo docker pull mongo docker run -d -p 27017:27017 --name mongodb mongodocker update mongodb --restartalways ## 开机自启动-d&#xff1a;表示以后台模式运行容器。 -p 27017:27017&#xff1a;将容器内部的 MongoDB 默认端口 27017 映射到宿主机的 27…

GB300加速推进,RTX 50显卡芯片量产延后,NVIDIA面临新的挑战与机遇

野村分析师Anne Lee在2月12日的报告中表示&#xff0c;2025年全球服务器营收将同比增长46%&#xff0c;2026年增长22%。其中&#xff0c;AI服务器营收预计在2025年和2026年分别增长75%和31%。这些预测与近期美国主要云服务提供商(CSP)上调的资本支出指引基本一致。 GB300加速推…

[NOIP2011 普及组] 统计单词数 题解

&#xff08;一&#xff09;读懂题目 关键词&#xff1a;查找单词 方法&#xff1a;枚举&#xff08;二&#xff09;分析算法时间复杂度和空间复杂度 算法&#xff1a;枚举 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(n)&#xff08;三&#xff09;代码实现 代码如…

深入解析 ipoib_intf_init 函数中的 netdev_ops 设置逻辑

在 Linux 内核的网络设备驱动开发中,net_device_ops 是一个至关重要的结构体,它定义了网络设备的各种操作函数指针,决定了网络设备的行为和功能。本文将深入解析 ipoib_intf_init 函数中关于 dev->netdev_ops 和 priv->rn_ops 的设置逻辑,帮助读者理解其设计动机和实…

leetcode_1760 袋子里最少数目的球

1. 题意 给定一个数组&#xff0c;和一个最多次操作次数。每次操作可以将数组中的一个数 x x x分成两个数 t x − t t\quad x-t tx−t。问 m a x O p e r a t i o n C n t maxOperationCnt maxOperationCnt次操作后&#xff0c;数组中最大的数最小的值是多少。 2. 题解 这个…

TDengine 性能测试工具 taosBenchmark

简介工具获取运行 无参数模式命令行模式配置文件模式 命令行参数配置文件参数 通用配置参数写入配置参数 数据库相关超级表相关标签列与数据列写入行为相关 查询配置参数 执行指定查询语句查询超级表 订阅配置参数数据类型对照表 配置文件示例 写入 JSON 示例查询 JSON 示例订阅…

J6 X8B/X3C切换HDR各帧图像

1、OV手册上的切换命令 寄存器为Ox5074 各帧切换&#xff1a; 2、地平线control tool实现切换命令 默认HDR模式出图&#xff1a; HCG出图&#xff1a; LCG出图 SPD出图 VS出图

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…

【故障处理】- RMAN-06593: platform name ‘Linux x86 64-bitElapsed: 00:00:00.00‘

【故障处理】- RMAN-06593: platform name Linux x86 64-bitElapsed: 00:00:00.00 一、概述二、报错原因三、解决方法 一、概述 使用xtts迁移&#xff0c;在目标端进行恢复时&#xff0c;遇到RMAN-06593: platform name Linux x86 64-bitElapsed: 00:00:00.00’报错。 二、报错…

多模态本地部署和ollama部署Llama-Vision实现视觉问答

文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…

MySQL调用存储过程和存储函数

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

TCP粘包/拆包

一、什么是 TCP 粘包/拆包&#xff1f;发生的原因&#xff1f;怎么解决&#xff1f; TCP粘包&#xff1a;指在进行TCP数据传输时&#xff0c;多个小的数据包被合并成一个大的数据包进行传输的现象。 TCP拆包&#xff1a;指一个大的数据包被拆分成多个小的数据包进行传输的现象…

网络防御高级-第8章及之前综合作业

标准版 接口ip配置 r2 [r2]interface GigabitEthernet 0/0/0 [r2-GigabitEthernet0/0/0]ip address 13.0.0.3 24 [r2-GigabitEthernet0/0/0]interface GigabitEthernet 0/0/1 [r2-GigabitEthernet0/0/1]ip address 100.1.1.254 24 [r2-GigabitEthernet0/0/1]interface Gigab…

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤&#xff1a; 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素…

【数据结构】寻找规律:算对角线长度||杨辉三角||魔方问题(C语言实现)

目录标题 三个算法1. 求矩阵对角线元素之和&#xff08;C语言&#xff09;2. 杨辉三角3. 幻方问题 总结&#xff1a;都是通过寻找规律来找出构造逻辑然后用循环来实现 三个算法 1. 求矩阵对角线元素之和&#xff08;C语言&#xff09; 1.初始化行循环变量i和列循环遍历j&…

Vue的学习(5)

1.路由进阶 1.路由模块封装 路由的封装抽离 问题&#xff1a;所有的路由配置都堆在main.js中合适么&#xff1f; 目标&#xff1a;将路由模块抽离出来。 好处&#xff1a;拆分模块&#xff0c;利于维护 小结&#xff1a; 路由模块的封装抽离的好处是什么&#xff1f; 拆分模…

设备智能化无线通信,ESP32-C2物联网方案,小尺寸芯片实现大功能

在科技飞速发展的当下&#xff0c;我们的生活正被各类智能设备悄然改变&#xff0c;它们如同一位位无声的助手&#xff0c;渗透到我们生活的每一个角落&#xff0c;让生活变得更加便捷和丰富多彩。 智能插座、智能照明和简单家电设备在家居领域的应用&#xff0c;为我们的生活…