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

力扣: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:

输入: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

思路:

本题很简单,但很适合用来做动态规划(和递归)的入门题,本篇文章主要讲解一下动态规划的思路

动态规划

动规五部曲:

这里我们要用一个一维dp数组来保存递归的结果

  1. 确定dp数组以及下标的含义

dp[i]的定义为:第i个数的斐波那契数值是dp[i]

  1. 确定递推公式

为什么这是一道非常简单的入门题目呢?

因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

  1. dp数组如何初始化

题目中把如何初始化也直接给我们了,如下:

        dp[0] = 0dp[1] = 1
  1. 确定遍历顺序

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

  1. 举例推导dp数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55

如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。

以上就是动态规划五部曲 这在之后将贯穿所有动态规划类的题目

完整代码和复杂度分析:

动态规划版本1(定义dp数组):

class Solution:def fib(self, n: int) -> int:# 排除 Corner Caseif n == 0:return 0# 创建 dp table dp = [0] * (n + 1)# 初始化 dp 数组dp[0] = 0dp[1] = 1# 遍历顺序: 由前向后。因为后面要用到前面的状态for i in range(2, n + 1):# 确定递归公式/状态转移公式dp[i] = dp[i - 1] + dp[i - 2]# 返回答案return dp[n]
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

动态规划版本2(不自定义dp数组,仅使用3个变量来维护dp数组):

class Solution:def fib(self, n: int) -> int:if n <= 1:return ndp = [0, 1]for i in range(2, n + 1):total = dp[0] + dp[1]dp[0] = dp[1]dp[1] = totalreturn dp[1]
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

递归版本:

class Solution:def fib(self, n: int) -> int:if n < 2:return nreturn self.fib(n - 1) + self.fib(n - 2)
  • 时间复杂度:O(2^n)
  • 空间复杂度:O(n)
http://www.lryc.cn/news/271515.html

相关文章:

  • Python3,压箱底的代码片段,提升工作效率稳稳的。
  • Flowable-升级为7.0.0.M2-第三节
  • JavaWeb——前端之AjaxVue
  • 在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
  • uni-app/vue封装etc车牌照输入,获取键盘按键键值
  • iostat获取IO延迟单位从ms调整us的方案
  • K8s 源码剖析及debug实战之 Kube-Scheduler(四):预选算法详解
  • ES6之解构赋值详解
  • UntiyShader(五)属性、内置文件和变量
  • Pytorch简介
  • 亚马逊云科技Amazon Q,一款基于生成式人工智能的新型助手
  • 骑砍战团MOD开发(29)-module_scenes.py游戏场景
  • ROS学习记录:ROS系统中的激光雷达消息包的数据格式
  • Vue.js和Node.js的关系--类比Java系列
  • 我的笔记本电脑死机问题折腾记录
  • uniApp中uView组件库的丰富布局方法
  • TDD-LTE 寻呼流程
  • TCP中的三次握手和四次挥手
  • NAO.99b海潮模型的详解教程
  • Plantuml之JSON数据语法介绍(二十五)
  • 迅为龙芯2K1000开发板虚拟机 ubuntu 更换下载源
  • 你好!Apache Seata
  • RFC6749-OAuth2.0
  • 【代码解析】代码解析之生成token(1)
  • 牛客网SQL训练5—SQL大厂面试真题
  • kubeadm来搭建k8s集群。
  • 【java爬虫】使用element-plus进行个股详细数据分页展示
  • Python使用余弦相似度比较两个图片
  • 树莓派4B-Python使用PyCharm的SSH协议在电脑上远程编辑程序
  • Servlet的自动加载、ServletConfig对象、ServletContext对象