力扣 | 509. Fibonacci

509. 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。
该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。示例 1:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2示例 3:
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3提示:
0 <= n <= 30

最原始的递归解法:Fibonacci1

public int fib(int n) {//用这道题目去理解动态规划return dfs(n);}// 时间复杂度:O(2^n)private int dfs(int n) {if (n == 0) return 0;if (n == 1) return 1;int leftFib = dfs(n - 1);int rightFib = dfs(n - 2);return leftFib + rightFib;}
}

利用Map存下已经计算出来的值,消除重复计算。Fibonacci2

public class Fibonacci2 {private Map<Integer, Integer> map;public int fib(int n) {map = new HashMap<>();return dfs(n);}// 时间复杂度:O(n)private int dfs(int n) {if (n == 0) return 0;if (n == 1) return 1;// 先从 Map 中检索子问题的解// 如果已经计算,则直接返回即可if (map.containsKey(n)) {return map.get(n);}int leftFib = dfs(n - 1);int rightFib = dfs(n - 2);// 将计算好的结果放入到 Map 中,编译后续检索map.put(n, leftFib + rightFib);return leftFib + rightFib;}
}

如果对空间复杂度要求更高,就可以用数组。Fibonacci3

public class Fibonacci3 {public int fib(int n) {int[] memo = new int[n + 1];//上一个代码的key不会超过n,所以考虑数组方式,因为是求的dfs(n) ,索引为n就是数组长度为 n + 1/** 数组比map要好一些,map的空间复杂度要比数组更大,而且会有hash冲突。对空间要求高就用数组*/Arrays.fill(memo, -1);return dfs(n, memo);}// 时间复杂度:O(n)private int dfs(int n, int[] memo) {if (n == 0) return 0;if (n == 1) return 1;if (memo[n] != -1) {return memo[n];}int leftFib = dfs(n - 1, memo);int rightFib = dfs(n - 2, memo);memo[n] = leftFib + rightFib;return leftFib + rightFib;}
}

状态转移:Fibonacci4

//动态规划包含这四个步骤
public class Fibonacci4 {public int fib(int n) {if (n <= 1) return n;// 1. 定义数组,arr[i] 表示的是数字 i 的斐波那契数int[] arr = new int[n + 1];// 2. 初始化数组元素arr[0] = 0;arr[1] = 1;// 3. 计算数组的元素for (int i = 2; i <= n; i++) {arr[i] = arr[i - 1] + arr[i - 2];}// 4. 返回最终结果return arr[n];}}

引出动态规划:Fibonacci5

public class Fibonacci5 {// 动态规划的四个步骤public int fib(int n) {if (n <= 1) return n;// 1. 定义状态数组,dp[i] 表示的是数字 i 的斐波那契数int[] dp = new int[n + 1];// 2. 状态初始化dp[0] = 0;dp[1] = 1;// 3. 状态转移for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}// 4. 返回最终需要的状态值return dp[n];}}

状态空间压缩:Fibonacci6

public class Fibonacci6 {  //最终面试官想要的答案  空间复杂度O(1) 时间复杂度O(n)// 状态数组空间压缩public int fib(int n) {if (n <= 1) return n;// 只存储前两个状态int prev = 0;int curr = 1;for (int i = 2; i <= n; i++) {int sum = prev + curr;prev = curr;curr = sum;}return curr;}}

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

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

相关文章

自动计算薪资-全优学堂

功能说明 全优学堂薪资模块则根据基础薪资、历史上课情况、课程销售情况自动计算员工薪资&#xff0c;帮助您更好地进行成本管理。系统根据教职工的排班情况、课时数和提成规则&#xff0c;自动计算教职工的薪资&#xff0c;大大减轻工资管理负担。 #1. 基础薪资配置 设置本…

智能音箱喇叭底噪大的问题

智能音箱喇叭底噪大的问题 3w的喇叭&#xff0c;放大8到12倍。speaker外放模式. 播放时底噪声很大&#xff0e;可在播放时音量减到最小凑近听&#xff0c;发现在半米的范围内都能听到底噪声&#xff0e; 分析过程 引原始的pa输出线出来引功放处理后的音频信号输出线出来&…

积萨伯爵不懈追求恒久卓越,花为缘集团不断探索时尚的型格魅力

近年来&#xff0c;高端腕表凭借着卓越的制表技艺、悠久的制表历史以及不拘一格的美学特色&#xff0c;逐渐受到各大明星演员&#xff0c;时尚博主的青睐&#xff0c;成为他们出席各大重要场合&#xff0c;彰显个人品位和地位的时尚百搭单品。 积萨伯爵作为专业做培育珠宝和高…

复习python从入门到实践——函数function

复习python从入门到实践——函数function 函数是特别难的&#xff0c;大家一定要好好学、好好复习、反复巩固。函数没学好&#xff0c;会为后面造成很大困扰。 教科书中函数举例会稍微有点复杂。在此章复习中&#xff0c;我将整理出容易疏漏和混淆的知识点&#xff0c;并用最简…

Django 入门教程|Web开发|用户管理实战

简介 Django是一个主流的Python Web框架&#xff0c;用于快速开发 Web 应用程序。功能强大&#xff0c;Python Web应用开发的第一选择。 特点 ORM&#xff08;对象关系映射&#xff09;&#xff1a; Django 提供了一个强大的 ORM&#xff0c;允许开发者通过 Python 代码来定义…

LLM、AGI、多模态AI 篇四:ChatGLM3部署和应用

文章目录 系列简介部署和运行推荐硬件要求部署步骤配置Python环境下载模型文件克隆项目代码安装依赖运行Demo修改demo源代码运行Demo可执行文件应用代码调用Langchain+RAG+ChatGLM3OpenAI API 支持

塔式服务器的好处

之前我们聊过服务器可以根据外观来进行分类&#xff0c;分别有刀片式服务器、塔式服务器和机架式服务器&#xff0c;那今天我们就来了解一下塔式服务器的好处有哪些&#xff1f; 塔式服务器是我们最常见的一种服务器结构&#xff0c;整体外观是立式结构&#xff0c;占地面积小&…

Shell 专栏目录

使用 1. shell 切片参数解释 2. shell 命令替换&#xff08;将 curl 等输出的内容使用变量接收&#xff09; 3. shell 数字运算相关操作 4. shell 小数结果转为百分制&#xff0c;并去除小数部分 问题 1. shell 脚本文件换行错误

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作&#xff0c;本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中&#xff0c;在生成的exe中。动态链接库是在程序运行时链接的&#xff0c;可以在程序运行时调用加载库函数的方法来实现&…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

苹果电脑交互式原型设计软件Axure RP 9 mac特色介绍

Axure RP 9 for Mac是一款交互式原型设计软件&#xff0c;使用axure rp9以最佳的方式展示您的作品&#xff0c;优化现代浏览器并为现代工作流程设计。同时确保您的解决方案正确完整地构建。Axure RP 9 for Mac为您整理笔记&#xff0c;将其分配给UI元素&#xff0c;并合并屏幕注…

YOLO物体检测-系列教程6:YOLOv5源码解析1

计算机视觉 全教程 目录 物体检测 系列教程 总目录 1、基本概述 YOLOv5没有一篇对应的论文&#xff0c;是一个对v4更好的实现v5版本是一个在github更新的基于工程项目的实现基本上和v4没有差异&#xff0c;只不过在整个项目上做出了更好的实现效果主要基于github的文档介绍来…

嵌入式物联网项目开发实战例程-STM32F103系列之外围器件代码

开发STM32F103很好的参考例程&#xff0c;轻松实现各类外围器件的开发。持续更新中&#xff0c;欢迎关注及收藏。 0001基于STM32F103单片机GPIO实现控制LED灯闪烁的程序代码.zip 0002基于STM32F103单片机GPIO实现按键KEY的检测程序代码.zip 0003基于STM32F103单片机GPIO实现外部…

Visual Studio 2022 AI Code 支持

1.先在 Log In | Codeium Free AI Code Completion & Chat 上注册一个用户 在Visual Stuido 中扩展中搜索 codeium 并安装 安装完成后登录即可。 注意国内可能存在网络问题无法使用这时建议使用代理进行登录。 地址如下&#xff1a; Sign Up | Codeium Free AI Code Co…

常见子函数头简介

1、FileManager.cpp bool CFileMgrBase::travelsal(const char *filename, int flag); bool travelsal(const char *filename, int flag);- 函数功能: 遍历待处理文件夹 - 输 入: filename: 文件(夹)名字符串 - 输 入: flag : 功能键 - 返…

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…

SQL 高级面试题

1. 什么是事务 参考答案 数据库的事务&#xff08;Transaction&#xff09;是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行&am…

多模态推荐系统综述:三、多模态特征增强

三、多模态特征增强 同一对象的不同模态表示具有独特且共同的语义信息。如果能够区分独特特征和共同特征&#xff0c;那么MRS的推荐性能和泛化能力可以得到显着提高。解耦表征学习&#xff08;DRL&#xff09;和对比学习&#xff08;CL&#xff09;被用来进行基于交互的特征增…

第二证券:主力为什么要砸盘?

砸盘就是在股票的某个阶段有许多卖出单&#xff0c;这些许多的卖出单不断的成交使股票价格出现快速下跌。一般是受到主力资金洗盘或者出货所影响形成的。 1、洗盘 个股通过长时间上涨之后&#xff0c;盘中的散户较多&#xff0c;主力为了洗掉盘中的散户&#xff0c;在低位吸筹…

从私有Git仓库的搭建到命令的使用及部署再到分支管理

一、版本控制系统/版本控制器 1. 版本控制系统&#xff1a; git 分布式 —没有中心代码库&#xff0c;所有机器之间的地位同等&#xff08;每台机器上都有相同的代码&#xff09; svn 集中管理的 —有中心代码库&#xff0c;其他都是客户端 2.git与svn介绍 1.git属于分布…