算法力扣刷题记录 六十九【动态规划基础及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
- 题目分析:虽然这道题放在了动态规划方法的下面。但是拿到题应该先判断这个能用什么方法。
- 学二叉树和回溯的时候,递归函数写的不错。那么递归能不能完成呢?感觉求F(n) = F(n-1) + F(n-2)是一个重复调用的过程,有点循环执行同一段代码的过程。
- 递归三部曲:
- 确定函数参数: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
- 用动态规划来做。动态规划解决当前状态可以由之前状态推导而得。本题的状态递推公式:F(n) = F(n - 1) + F(n - 2)。
- 第一步:确定dp数组的含义和下标。一维数组足够。下标代表n。数值代表F(n)。初始为31个,因为n <= 30;
- 第二步:初始化dp数组。前两个特殊的值: dp[0] =0; dp[1] = 1;
- 第三步:遍历数组。因为递推公式是从前往后,所以遍历顺序是从前往后。for循环初始为下标2。
- 第四步: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 参考学习
参考学习链接
- 五部曲在2.2思路2中已经分析;但是对比参考代码,可以修改的地方有:
- dp数组根据传入的参数n来确定。vector< int> dp(n+1,0);之后初始化。
-
进一步 “状态压缩”,只维护两个数值。这样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];} };
三、总结

(欢迎指正,转载标明出处)
相关文章:
算法力扣刷题记录 六十九【动态规划基础及509. 斐波那契数】
前言 调整一下做题顺序,多个章节同步进行,穿插练习。可以在各章节的专栏中找同一类。 记录 六十九【动态规划基础】。 一、动态规划理论基础学习 参考学习链接 二、509. 斐波那契数 2.1 题目阅读 斐波那契数 (通常用 F(n) 表示&#x…...
如何利用Python进行数据分析
在当今这个大数据时代,数据分析已经成为了各行各业都非常重视的技能。而Python作为一门强大且易学的编程语言,成为了数据分析领域的主流工具之一。那么,如何利用Python进行数据分析呢? 一、安装Python及数据分析库 首先…...
如何判断机器学习模型的好坏之LIME和SHAP
LIME(Local Interpretable Model-agnostic Explanations)和SHAP(SHapley Additive exPlanations)是两种广泛使用的模型可解释性技术,旨在帮助理解复杂机器学习模型的决策过程。 LIME LIME (Local Interpretable Model-agnostic Explanations) 是一种技术,用于解释任何机…...
Android 是如何进行内存管理的
目录 1. 垃圾回收 (Garbage Collection)2. 内存分配3. 内存泄漏检测4. 内存优化5. 内存抖动 (Memory Churn)6. 内存警告 (Memory Warning)7. 内存分页 (Memory Paging)8. 内存分段 (Memory Segmentation)9. 内存压缩 (Memory Compaction)10. 内存分区 (Memory Partitioning)11.…...
【CSDN平台BUG】markdown图片链接格式被手机端编辑器自动破坏(8.6 已修复)
文章目录 bug以及解决方法bug原理锐评后续 bug以及解决方法 现在是2024年8月,我打开csdn手机编辑器打算修改一下2023年12月的一篇文章,结果一进入编辑器,源码就变成了下面这个样子,我起初不以为意,就点击了发布&#…...
WPF学习(4)- VirtualizingStackPanel (虚拟化元素)+Canvas控件(绝对布局)
VirtualizingStackPanel虚拟化元素 VirtualizingStackPanel 类(虚拟化元素)和StackPanel 类在用法上几乎差不多。其作用是在水平或垂直的一行中排列并显示内容。它继承于一个叫VirtualizingPanel的抽象类,而这个VirtualizingPanel抽象类继承…...
SQL约束
目录 1.常见的SQL约束 1.1 添加主键约束 1.2 单独添加主键约束 1.3 删除主键约束 1.4 设置自动增长 2.添加非空约束 3.添加唯一约束 4.添加默认值约束 我们已知道,创建数据表语法: create table 表名(字段名1 数据类型(长度) [约束],字段名…...
lombok使用@slf4j 运行时提示找不到符号log(Missing POM for org.projectors:lombok:jar)
1.问题表现 原本是之前搭建好的工程,只是换了个开发环境重新启动就不行了。一直编译不通过! 可以看到IDEA其实是引入了依赖的 都没有出现红色波浪线 <mapstruct.version>1.5.5.Final</mapstruct.version> <lombok.version>1.18.30<…...
21. 合并两个有序链表(递归)
目录 一;题目: 二代码; 三:结果: 一;题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 二代码; /*** Definition for singly-linked list.* struct ListNode {* …...
学习vue3 三,组件基础,父子组件传值
组件基础 每一个.vue 文件都可以充当组件来使用 每一个组件都可以复用 父组件引入之后可以直接当标签使用 案例: App.vue <script setup lang"ts"> import BaseRefAndReactive from "./components/BaseRefAndReactive.vue";</sc…...
月木学途开发 2.项目架构
1.项目介绍 月木学途是一款it在线学习网站,项目采用前后端分离架构。前端开发主要使用vue.js,后端使用Spring Cloud Alibaba技术栈。项目包含学习网站的大部分功能,分为管理员端和用户端。管理员端有权限管理、课程管理、网站管理、求职模块管…...
FPGA开发——按键控制数码管的设计
一、概述 按键控制数码管是一种常见的电子显示技术,它结合了按键输入与数码管显示的功能。在这一设计中,用户通过按下不同的按键来发送指令,这些指令随后被处理并转换为数码管上显示的数字或字符。按键通常作为输入设备,通过电路…...
【AI学习】[2024北京智源大会]具身智能:具身智能关键技术研究:操纵、决策、导航
具身智能关键技术研究:操纵、决策、导航 董 豪 | 北京大学助理教授 依然是边看边做些记录 这张图的重点是在说,我们的大脑,也是不同的部分处理不同的功能。这里面有些功能,比如视觉、听觉理解等功能,LLM已经具备&…...
C语言实现UDP广播
UDP 广播发送方 1.创建套接字:使用socket()函数创建一个UDP套接字。 2.设置套接字选项:使用setsockopt()函数设置SO_BROADCAST选项以允许广播。 3.发送数据:使用sendto()函数将数据发送到特定的广播地址和端口。 #include <stdio.h> …...
速记Java八股文——Redis 篇
前言 分类汇总 50 常见的 Redis 篇 经典后端面试题,并对题目进行了精炼总结,旨在帮助大家高效记忆,在面试中游刃有余,不至于陷入词穷的窘境。 Redis 篇 什么是Redis? Redis是一个开源的内存数据结构存储系统,可用作数…...
CUDA编程05 - GPU内存架构和数据局部性
一:概述 到目前为止,我们已经学会了如何编写 CUDA 核函数,以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构,以及线程在硬件上调度执行过程。在本章中,我们将重点关注 GPU 的片上(on-chi…...
TCP协议程序设计
文章目录 前言一、TCP协议程序是什么?二、使用步骤 1.服务器端与客户端2.实操展示总结 前言 TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序&…...
【C++高阶】:自定义删除器的全面探索
✨ 我凌于山壑万里,一生自由随风起 🌏 📃个人主页:island1314 🔥个人专栏:C学习 🚀 欢迎关注:👍点赞 👂&am…...
Java中的不可变集合、Stream流以及异常处理的
目录 1. 不可变集合 如何创建不可变集合 2. Stream流 Stream基本操作 3. 异常处理 异常的分类 异常处理机制 1. 不可变集合 在Java中,不可变集合指的是一旦创建后内容不可更改的集合。这种集合的好处在于它们可以安全地被多个线程访问而无需同步,…...
LeetCode面试题Day1|LeetCode26 删除有序数组中的重复项、LeetCode80 删除有序数组中的重复项Ⅱ
前言: 暑假实在不知道干什么了,做一下力扣的《面试经典150题》吧,记录一下学习轨迹。(如果有要打非中文竞赛或者精进一下英语水平的记得把力扣调成英文) 题目1: 指路: . - 力扣(LeetCode)26…...
OpenClaw技能开发入门:为gemma-3-12b-it编写第一个天气查询模块
OpenClaw技能开发入门:为gemma-3-12b-it编写第一个天气查询模块 1. 为什么选择OpenClaw开发自定义技能? 去年冬天,我经常需要同时查看多个城市的天气来决定出差行程。反复切换浏览器标签和天气应用的低效操作,让我萌生了用AI自动…...
计算机网络:从基础到未来趋势,从0死磕全栈之Next.js 中间件(Middleware)详解与实战。
计算机网络基础概念 计算机网络是通过通信链路和交换设备将地理上分散的计算机系统连接起来,实现资源共享和信息传递的系统。其核心目标是提供高效、可靠的数据传输服务。 网络拓扑结构包括星型、总线型、环型和网状等。每种拓扑结构在性能、可靠性和成本上各有优劣…...
从CAN到UAVCAN:一文搞懂两种协议的核心差异及迁移指南
从CAN到UAVCAN:两种通信协议的深度解析与迁移实战 在嵌入式系统开发领域,CAN总线协议已经服务了汽车电子和工业控制三十余年,而它的进化版本UAVCAN正在无人机和机器人领域掀起一场通信革命。当我第一次在四旋翼飞行器项目中尝试将传统CAN节点…...
Python集合怎么去重_Set数据结构特性与交并差集合运算
set()去重不生效因只支持不可变类型,含列表、字典等会报TypeError;需转为可哈希形式如tuple(sorted(d.items()));自定义类须实现__hash__和__eq__;set无序,保序用dict.fromkeys();符号运算要求两边为set&am…...
如何利用秒排 seo 快速提升关键词排名
如何利用秒排 seo 快速提升关键词排名 在互联网时代,搜索引擎优化(SEO)已经成为提升网站流量和品牌知名度的关键手段。其中,“秒排 SEO”这一概念在近几年越来越受到关注。究竟什么是“秒排 SEO”,如何利用它来快速提…...
MPR121电容触摸传感器驱动与抗干扰工程实践
1. MPR121电容式接近/触摸传感器控制器深度技术解析 MPR121是由NXP Semiconductors(原Freescale)推出的12通道电容式触摸与接近感应专用协处理器芯片,广泛应用于STM32、ESP32、nRF52等主流MCU平台的嵌入式人机交互系统中。该器件并非通用IC外…...
【电路设计实战】BUCK降压电源:从原理到PCB布局的降噪与效率优化
1. BUCK降压电路的核心原理 BUCK降压电路作为开关电源中最基础的拓扑结构之一,其工作原理看似简单却蕴含着精妙的能量转换机制。我第一次接触BUCK电路时,被它高达90%以上的转换效率所震撼 - 这可比传统的线性稳压器强太多了。那么它是如何做到的呢&#…...
三步掌握Alienware终极控制权:AlienFX Tools新手完全指南
三步掌握Alienware终极控制权:AlienFX Tools新手完全指南 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 你是否厌倦了Alienware官方软件的…...
如何快速将网页转换为Figma设计稿:5分钟完成HTML到Figma的无缝转换
如何快速将网页转换为Figma设计稿:5分钟完成HTML到Figma的无缝转换 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html HTML到Figma转换工具是一款能够将任何网站转换为可…...
PHP脚本设置无限执行时间的四种方法
为 PHP 脚本设置无限执行时间是一个在特定场景下可能需要的操作,比如执行长时间运行的后台任务、数据迁移、大批量数据处理等。然而,值得注意的是,设置无限执行时间并不是一种推荐的做法,因为它可能导致服务器资源被长时间占用&am…...
