剑指Offer10-I.斐波那契数列 C++

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。
示例 1
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5

2、VS2019上运行

代码随想录的五步曲

#include <iostream>
#include <vector>class Solution {
public:int fib(int N) {if (N <= 1) return N;std::vector<int> dp(N + 1); // 创建一个长度为 N+1 的动态数组 dpdp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {dp[i] = dp[i - 1] + dp[i - 2]; // 计算斐波那契数列第 i 项的值}return dp[N]; // 返回斐波那契数列第 N 项的值}
};int main() {int N = 5;Solution s;int result = s.fib(N); // 调用 fib 方法计算斐波那契数列第 N 项的值std::cout << "Fibonacci number at position " << N << " is: " << result << std::endl;return 0;
}

运行结果:
Fibonacci number at position 5 is: 5
(这里出问题了,N=45时就出现错误,这是因为对于斐波那契数列,随着 n 的增加,数列的值增长非常迅速。当使用普通的整数类型(如 int 或 long long)进行计算时,这些类型的取值范围是有限的,无法容纳较大的斐波那契数列项。)

换官方题解

#include <iostream>class Solution {
public:int fib(int n) {int MOD = 1000000007;  // 定义一个常量 MOD,用于取模运算if (n < 2) {return n;  // 如果 n 小于 2,直接返回 n 的值,因为斐波那契数列的前两项是 0 和 1}int p = 0, q = 0, r = 1;  // 初始化前两项和当前项的值for (int i = 2; i <= n; ++i) {p = q;  // 将 q 的值赋给 p,保留前一个项的值q = r;  // 将 r 的值赋给 q,更新当前项的值r = (p + q) % MOD;  // 计算下一项的值,并对 MOD 取模以避免溢出}return r;  // 返回斐波那契数列第 n 项的值}
};int main() {int N = 10;Solution s;  // 创建 Solution 类的对象int result = s.fib(N);  // 调用 fib 方法计算斐波那契数列第 N 项的值std::cout << "Fibonacci number at position " << N << " is: " << result << std::endl;return 0;
}

运行结果:
Fibonacci number at position 10 is: 55

3、代码随想录解题思路

代码随想录的动态规划五步曲

  • 1、确定dp数组(dp table)以及下标的含义
  • 2、确定递推公式
  • 3、dp数组如何初始化
  • 4、确定遍历顺序
  • 5、举例推导dp数组

4、官方题解解题思路

  • 1.首先,我们定义了一个类 Solution,其中包含一个名为 fib 的方法,用于计算斐波那契数列的第 N 项的值。
  • 2.在 fib 方法中,我们首先定义了一个常量 MOD,用于进行取模运算。这个常量的值是 1000000007,是为了在计算过程中避免溢出。
  • 3.接下来,我们使用一个条件语句判断给定的 n 是否小于 2。如果是,则直接返回 n 的值,因为斐波那契数列的前两项是 0 和 1,所以它们的值与 n 相等。
  • 4.然后,我们初始化三个变量 p、q 和 r 分别为 0、0 和 1。这些变量分别表示当前项、前一项和下一项的值。
  • 5.进入循环,从索引 2 开始,直到 n。在每次循环中,我们更新变量的值:将 q 的值赋给 p,r 的值赋给 q,并计算 (p + q) % MOD 的结果并赋给 r。这样就实现了逐步计算斐波那契数列的下一项的值。
  • 6.循环结束后,我们返回变量 r 的值作为斐波那契数列的第 N 项的结果。

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

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

相关文章

Redis_事务操作

13. redis事务操作 13.1事务简介 原子性(Atomicity) 一致性(Consistency) 隔离性(isolation) 持久性(durabiliby) ACID 13.2 Redis事务 提供了multi、exec命令来完成 第一步&#xff0c;客户端使用multi命令显式地开启事务第二步&#xff0c;客户端把事务中要执行的指令发…

前沿分享-通过经皮神经刺激来治疗糖尿病神经性疼痛

经皮神经电刺激&#xff08;PENS&#xff09;设备用于对糖尿病周围神经病变引起的慢性、顽固性疼痛进行多次治疗。 放在耳朵上的这种可穿戴设备在几天内持续提供低水平的脉冲电流。 这是一种安全有效的非麻醉性替代治疗慢性疼痛的方法。还有一张设备放在糖足上的照片&#xff0…

向量数据库 Milvus Cloud Partition Key:租户数量多,单个租户数据少的三种解决方案

三种解决方案 这个问题提出的时候,Milvus 的最新版本是 2.2.8,我们做个角色互换,在当时站在这个用户的角度,留在我们面前的选择有这么几个: 为每个租户创建一个 collection 为每个租户创建一个 partition 创建一个租户名称的标量字段 接下来,我们依次分析下这三种方案的可…

《零基础实践深度学习》(第2版)学习笔记,(五)深度学习与计算机视觉

文章目录 1. 计算机视觉概述2. 图像分类3. 目标检测 1. 计算机视觉概述 图像分类 目标检测 2. 图像分类 3. 目标检测

01-C++数据类型

3、基础类型 3.1、简单变量 变量的命名 carDrip和cardRip 或boat_sport和boats_port 此外&#xff0c;还有有前缀的命名&#xff0c;使用前缀表示数据类型。常见的前缀有:str&#xff08;表示字符串&#xff09;、n&#xff08;表示整数值&#xff09;、b&#xff08;表示…

深入探究QCheckBox的三种状态及其用法

文章目录 引言&#xff1a;三种状态一、未选中状态&#xff08;0&#xff09;&#xff1a;二、选中状态&#xff08;2&#xff09;&#xff1a;三、部分选中状态&#xff08;1&#xff09;&#xff1a; 判断方法结论&#xff1a; 引言&#xff1a; QCheckBox是Qt框架中常用的复…

html css实现爱心

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…

修改Linux中SSH的端口

文章目录 修改Linux中SSH的端口Linux中默认的ssh端口关闭SELinux测试新端口 修改Linux中SSH的端口 Linux中默认的ssh端口 使用root用户操作 修改前先备份ssh_config cp /etc/ssh/sshd_config /etc/ssh/sshd_config_date "%Y%m%d%H%M%S"修改配置文件&#xff0c;找…

结构体的定义与赋值

1、结构体定义 首先定义一个学生结构体&#xff0c;如下所示&#xff1a; struct Student {int num;char name[32];char sex;int age; }; 接着在主函数中对学生进行声明&#xff0c;如下所示&#xff1a; #include<iostream> using namespace std;struct Student {in…

2023Robocom省赛(本科组)

RC-u1 亚运奖牌榜 题目链接&#xff1a;PTA | 程序设计类实验辅助教学平台 (pintia.cn) 题目&#xff1a; 2022 年第 19 届亚运会即将在杭州召开&#xff0c;杭州已经做好准备欢迎全亚洲的观众一同参与亚运盛会了&#xff01; 你正在开发一款跟亚运奖牌计算相关的 App。给定…

“深入探究JVM内部结构与工作原理:解析Java虚拟机“

标题&#xff1a;深入探究JVM内部结构与工作原理 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的内部结构与工作原理。我们将介绍JVM的基本组成部分&#xff0c;包括类加载器、运行时数据区和执行引擎。同时&#xff0c;我们将通过一个示例代码来说明…

直接在html中引入Vue.js的cdn来实现一个简单的上传图片组件

摘要 当使用 Vue.js 的 CDN 来实现一个简单的上传图片组件时&#xff0c;你可以利用 Vue 的数据绑定和事件处理能力&#xff0c;结合 HTML 和 CSS&#xff0c;轻松地创建一个交互式的图片上传界面。以下是一个示例&#xff1a; 代码结构 index.html <!DOCTYPE html> &…

LVS集群和分布式

LVS 一.集群和分布式概念 1.1 集群 在计算机领域&#xff0c;集群早在 1960 年就出现&#xff0c;随着互联网和计算机相关技术的发展&#xff0c;现在 集群这一技术已经在各大互联网公司普及。 1.1.1 集群概念 计算机集群指一组通过计算机网络连接的计算机&#xff0c;它们…

Rust 重载运算符|复数结构的“加减乘除”四则运算

复数 基本概念 复数定义 由实数部分和虚数部分所组成的数&#xff0c;形如a&#xff0b;bi 。 其中a、b为实数&#xff0c;i 为“虚数单位”&#xff0c;i -1&#xff0c;即虚数单位的平方等于-1。 a、b分别叫做复数a&#xff0b;bi的实部和虚部。 当b0时&#xff0c;a&…

前后端分离------后端创建笔记(06)新增接口页面布局

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Kubernetes入门 四、Pod核心

目录 什么是PodPod与容器不同Pod如何管理多个容器Pod的管理-工作负载K8s中的资源清单创建使用Pod直接创建Pod使用 Deployment 创建Pod 环境变量重启策略镜像拉取策略访问 DNS 的策略资源限制初始化容器临时容器&#xff08;了解&#xff09; 什么是Pod Pod 是可以在 Kubernete…

Azure添加网络接口

添加网络接口的意义 在 Azure 上&#xff0c;为虚拟机添加网络接口的意义包括以下几个方面&#xff1a; 扩展网络带宽&#xff1a;通过添加多个网络接口&#xff0c;可以增加虚拟机的网络带宽&#xff0c;提高网络传输速度和数据吞吐量。实现网络隔离&#xff1a;每个网络接口…

zabbix-6.4 监控 MySQL

目录 1、rpm安装zabbix_agentd服务 2、编写zabbix_agentd.conf文件 3、编写模板文件 4、创建mysql用户并赋权限 5、创建.my.cnf文件 6、将规则添加到SELinux策略中 注意&#xff1a; 若模板无法读取.my.cnf 信息&#xff0c;从而导致监控报错&#xff0c;可以尝试修改模…

虚树

虚树是用来优化树形dp的东西&#xff0c;它的转移是从一些特殊点&#xff0c;向根节点转移&#xff0c;期间它有用的转移点比较特殊。通常询问次数较多&#xff0c;但特殊点总和较少&#xff0c;就可以每次询问先建虚树再跑dp。单调栈建虚树 O ( k l o g n ) O(klogn) O(klogn)…

别人直播的时候怎么录屏?分享一些录屏方法

​随着互联网的快速发展&#xff0c;直播已经成为人们日常生活中不可或缺的一部分。但是&#xff0c;有时候我们可能会错过某些重要的直播内容&#xff0c;这时候就需要录屏来保存和观看。那么&#xff0c;如何录屏别人的直播呢&#xff1f;本文将分享一些录屏方法和技巧&#…