当前位置: 首页 > news >正文

算法力扣刷题记录 六十九【动态规划基础及509. 斐波那契数】

前言

调整一下做题顺序,多个章节同步进行,穿插练习。可以在各章节的专栏中找同一类。

记录 六十九【动态规划基础】。

一、动态规划理论基础学习

参考学习链接
在这里插入图片描述


二、509. 斐波那契数

2.1 题目阅读

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

0 <= n <= 30

2.2 尝试实现

思路1

  1. 题目分析:虽然这道题放在了动态规划方法的下面。但是拿到题应该先判断这个能用什么方法。
  2. 学二叉树和回溯的时候,递归函数写的不错。那么递归能不能完成呢?感觉求F(n) = F(n-1) + F(n-2)是一个重复调用的过程,有点循环执行同一段代码的过程。
  3. 递归三部曲:
  • 确定函数参数:int n;
  • 确定函数返回值:返回F(n)。所以类型是int;直接用给的主函数fit
  • 确定终止条件:F(0) =0和F(1)=1不符合统一公式,所以有两个终止条件;
  • 确定逻辑:return fit(n-1)+fit(n-2)即可。

代码实现【递归法】

class Solution {
public:int fib(int n) {if(n == 0) return 0;if(n == 1) return 1;return fib(n-1)+fib(n-2);}
};

思路2

  1. 动态规划来做。动态规划解决当前状态可以由之前状态推导而得。本题的状态递推公式:F(n) = F(n - 1) + F(n - 2)。
  2. 第一步:确定dp数组的含义和下标。一维数组足够。下标代表n。数值代表F(n)。初始为31个,因为n <= 30;
  3. 第二步:初始化dp数组。前两个特殊的值: dp[0] =0; dp[1] = 1;
  4. 第三步:遍历数组。因为递推公式是从前往后,所以遍历顺序是从前往后。for循环初始为下标2。
  5. 第四步:return dp[n]。

代码实现【动态规划】

把vector dp(31,0);改成静态数组 int dp[31];但是静态数组的值应该是随机的。不过for循环依次填充可以先放着。

class Solution {
public:int fib(int n) {vector<int> dp(31,0);//下标代表n。数值代表F(n)//初始化,前两个特殊。其实dp[0] =0;dp[1] = 1;//遍历填充数组for(int i = 2;i <= n;i++){//递推公式dp[i] = dp[i-1]+dp[i-2];}return dp[n];}
};

2.3 参考学习

参考学习链接

  1. 五部曲在2.2思路2中已经分析;但是对比参考代码,可以修改的地方有:
  • dp数组根据传入的参数n来确定。vector< int> dp(n+1,0);之后初始化。
  1. 进一步 “状态压缩”只维护两个数值。这样dp[2];用中间变量sum记录F(n)。dp[0]更新为dp[1],dp[1]更新为sum。

    class Solution {
    public:int fib(int N) {if (N <= 1) return N;int dp[2];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {int sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum;}return dp[1];}
    };
    

三、总结

在这里插入图片描述
(欢迎指正,转载标明出处)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙AI功能开发【文档扫描控件】 场景识别服务
  • 【c++学习技术栈】
  • 如何利用现成的网络抓取工具提高效率和生产力
  • [kimi笔记]为什么csc.exe不可以双击运行
  • Java面试题(基础篇)②
  • 攻击者劫持 Facebook 页面用于推广恶意 AI 照片编辑器
  • 将nestjs项目迁移到阿里云函数
  • 【开端】通过Java 过滤器灵活配置URL访问权限,并返回403
  • 浅谈基础的图算法——Tarjan求强联通分量算法(c++)
  • 本地Linux服务器创建我的世界MC私服并实现与好友异地远程联机游戏
  • java学习笔记 VSCode
  • Promethues Metrics
  • 深度学习助力自动驾驶:YOLO目标检测系统的实现与优化
  • 大数据mapper书写范式hdfs
  • 【中级软件设计师】加密技术、数字签名、数字证书 (附软考真题)
  • Android单元测试 - 几个重要问题
  • JavaScript创建对象的四种方式
  • Javascript基础之Array数组API
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • maven工程打包jar以及java jar命令的classpath使用
  • php的插入排序,通过双层for循环
  • vuex 笔记整理
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 彻底搞懂浏览器Event-loop
  • 从0到1:PostCSS 插件开发最佳实践
  • 精彩代码 vue.js
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 配置 PM2 实现代码自动发布
  • 嵌入式文件系统
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 国内开源镜像站点
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​io --- 处理流的核心工具​
  • ​数据链路层——流量控制可靠传输机制 ​
  • #数学建模# 线性规划问题的Matlab求解
  • (14)Hive调优——合并小文件
  • (void) (_x == _y)的作用
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (补充)IDEA项目结构
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)React组件、useState、组件样式
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • .net 4.0发布后不能正常显示图片问题
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net wcf memory gates checking failed
  • .Net 垃圾回收机制原理(二)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试