当前位置: 首页 > 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];}
    };
    

三、总结

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

相关文章:

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

前言 调整一下做题顺序&#xff0c;多个章节同步进行&#xff0c;穿插练习。可以在各章节的专栏中找同一类。 记录 六十九【动态规划基础】。 一、动态规划理论基础学习 参考学习链接 二、509. 斐波那契数 2.1 题目阅读 斐波那契数 &#xff08;通常用 F(n) 表示&#x…...

如何利用Python进行数据分析

在当今这个大数据时代&#xff0c;数据分析已经成为了各行各业都非常重视的技能。而Python作为一门强大且易学的编程语言&#xff0c;成为了数据分析领域的主流工具之一。那么&#xff0c;如何利用Python进行数据分析呢&#xff1f; 一、安装Python及数据分析库 首先&#xf…...

如何判断机器学习模型的好坏之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月&#xff0c;我打开csdn手机编辑器打算修改一下2023年12月的一篇文章&#xff0c;结果一进入编辑器&#xff0c;源码就变成了下面这个样子&#xff0c;我起初不以为意&#xff0c;就点击了发布&#…...

WPF学习(4)- VirtualizingStackPanel (虚拟化元素)+Canvas控件(绝对布局)

VirtualizingStackPanel虚拟化元素 VirtualizingStackPanel 类&#xff08;虚拟化元素&#xff09;和StackPanel 类在用法上几乎差不多。其作用是在水平或垂直的一行中排列并显示内容。它继承于一个叫VirtualizingPanel的抽象类&#xff0c;而这个VirtualizingPanel抽象类继承…...

SQL约束

目录 1.常见的SQL约束 1.1 添加主键约束 1.2 单独添加主键约束 1.3 删除主键约束 1.4 设置自动增长 2.添加非空约束 3.添加唯一约束 4.添加默认值约束 我们已知道&#xff0c;创建数据表语法&#xff1a; create table 表名(字段名1 数据类型(长度) [约束],字段名…...

lombok使用@slf4j 运行时提示找不到符号log(Missing POM for org.projectors:lombok:jar)

1.问题表现 原本是之前搭建好的工程&#xff0c;只是换了个开发环境重新启动就不行了。一直编译不通过&#xff01; 可以看到IDEA其实是引入了依赖的 都没有出现红色波浪线 <mapstruct.version>1.5.5.Final</mapstruct.version> <lombok.version>1.18.30<…...

21. 合并两个有序链表(递归)

目录 一;题目&#xff1a; 二代码; 三&#xff1a;结果&#xff1a; 一;题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 二代码; /*** Definition for singly-linked list.* struct ListNode {* …...

学习vue3 三,组件基础,父子组件传值

组件基础 每一个.vue 文件都可以充当组件来使用 每一个组件都可以复用 父组件引入之后可以直接当标签使用 案例&#xff1a; App.vue <script setup lang"ts"> import BaseRefAndReactive from "./components/BaseRefAndReactive.vue";</sc…...

月木学途开发 2.项目架构

1.项目介绍 月木学途是一款it在线学习网站&#xff0c;项目采用前后端分离架构。前端开发主要使用vue.js&#xff0c;后端使用Spring Cloud Alibaba技术栈。项目包含学习网站的大部分功能&#xff0c;分为管理员端和用户端。管理员端有权限管理、课程管理、网站管理、求职模块管…...

FPGA开发——按键控制数码管的设计

一、概述 按键控制数码管是一种常见的电子显示技术&#xff0c;它结合了按键输入与数码管显示的功能。在这一设计中&#xff0c;用户通过按下不同的按键来发送指令&#xff0c;这些指令随后被处理并转换为数码管上显示的数字或字符。按键通常作为输入设备&#xff0c;通过电路…...

【AI学习】[2024北京智源大会]具身智能:具身智能关键技术研究:操纵、决策、导航

具身智能关键技术研究&#xff1a;操纵、决策、导航 董 豪 | 北京大学助理教授 依然是边看边做些记录 这张图的重点是在说&#xff0c;我们的大脑&#xff0c;也是不同的部分处理不同的功能。这里面有些功能&#xff0c;比如视觉、听觉理解等功能&#xff0c;LLM已经具备&…...

C语言实现UDP广播

UDP 广播发送方 1.创建套接字&#xff1a;使用socket()函数创建一个UDP套接字。 2.设置套接字选项&#xff1a;使用setsockopt()函数设置SO_BROADCAST选项以允许广播。 3.发送数据&#xff1a;使用sendto()函数将数据发送到特定的广播地址和端口。 #include <stdio.h> …...

速记Java八股文——Redis 篇

前言 分类汇总 50 常见的 Redis 篇 经典后端面试题&#xff0c;并对题目进行了精炼总结&#xff0c;旨在帮助大家高效记忆&#xff0c;在面试中游刃有余&#xff0c;不至于陷入词穷的窘境。 Redis 篇 什么是Redis? Redis是一个开源的内存数据结构存储系统&#xff0c;可用作数…...

CUDA编程05 - GPU内存架构和数据局部性

一&#xff1a;概述 到目前为止&#xff0c;我们已经学会了如何编写 CUDA 核函数&#xff0c;以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构&#xff0c;以及线程在硬件上调度执行过程。在本章中&#xff0c;我们将重点关注 GPU 的片上(on-chi…...

TCP协议程序设计

文章目录 前言一、TCP协议程序是什么&#xff1f;二、使用步骤 1.服务器端与客户端2.实操展示总结 前言 TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的&#xff0c;一个称为服务器程序&#xff0c;另一个称为客户机程序&…...

【C++高阶】:自定义删除器的全面探索

✨ 我凌于山壑万里&#xff0c;一生自由随风起 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…...

Java中的不可变集合、Stream流以及异常处理的

目录 1. 不可变集合 如何创建不可变集合 2. Stream流 Stream基本操作 3. 异常处理 异常的分类 异常处理机制 1. 不可变集合 在Java中&#xff0c;不可变集合指的是一旦创建后内容不可更改的集合。这种集合的好处在于它们可以安全地被多个线程访问而无需同步&#xff0c;…...

LeetCode面试题Day1|LeetCode26 删除有序数组中的重复项、LeetCode80 删除有序数组中的重复项Ⅱ

前言&#xff1a; 暑假实在不知道干什么了&#xff0c;做一下力扣的《面试经典150题》吧&#xff0c;记录一下学习轨迹。(如果有要打非中文竞赛或者精进一下英语水平的记得把力扣调成英文) 题目1&#xff1a; 指路&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;26…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...