从小白开始刷算法 动态规划篇 leetcode.509

序言

虽然算法很难,但不应该就放弃。这是一个学习笔记,希望你们喜欢~

先自己尝试写,大概十几分钟仍然写不出来
看思路,再尝试跟着思路写
仍然写不出来,再看视频
b站up视频推荐:爱学习的饲养员

leetcode其他文章:

数组篇:
从小白开始刷算法 数组篇 leetcode.485
从小白开始刷算法 数组篇 leetcode.283
从小白开始刷算法 数组篇 leetcode.27

链表篇:
从小白开始刷算法 ListNode 链表篇 leetcode.203
从小白开始刷算法 ListNode 链表篇 leetcode.206

队列篇
从小白开始刷算法 ListNode 链表篇 leetcode.933

栈篇
从小白开始刷算法 Stack 栈篇 leetcode.20
从小白开始刷算法 Stack 栈篇 leetcode.496

哈希篇
从小白开始刷算法 Hash 哈希篇 leetcode.217
从小白开始刷算法 Hash 哈希篇 leetcode.705

树篇
从小白开始刷算法 Tree 树篇 先序遍历 leetcode.144
从小白开始刷算法 Tree 树篇 中序遍历 leetcode.94
从小白开始刷算法 Tree 树篇 后序遍历 leetcode.94

堆篇
从小白开始刷算法 Heap 堆篇 最大堆排序 leetcode.215
小白开始刷算法 Heap 堆篇 最小堆排序 leetcode.692

双指针篇
从小白开始刷算法 对撞双指针 leetcode.881
从小白开始刷算法 快慢双指针篇 leetcode.141

二分法篇
从小白开始刷算法 二分法篇 leetcode.704
从小白开始刷算法 二分法篇 leetcode.35
从小白开始刷算法 二分法篇 leetcode.162
从小白开始刷算法 二分法篇 leetcode.74

滑动窗口篇
从小白开始刷算法 滑动窗口篇 leetcode.209
从小白开始刷算法 滑动窗口篇 leetcode.1456

递归篇
从小白开始刷算法 递归篇 leetcode.509
从小白开始刷算法 递归篇 leetcode.206

分治法篇
从小白开始刷算法 分治法篇 leetcode.169
从小白开始刷算法 分治法篇 leetcode.53

回溯法篇
从小白开始刷算法 回溯法篇 leetcode.22
从小白开始刷算法 回溯法篇 leetcode.78

dfs篇
从小白开始刷算法 dfs篇 leetcode.938
从小白开始刷算法 dfs篇 leetcode.200

bfs篇
从小白开始刷算法 bfs篇 leetcode.102

并查集篇
从小白开始刷算法 并查集篇 leetcode.200
[从小白开始刷算法 并查集篇 leetcode.547

记忆化搜索篇
从小白开始刷算法 记忆化搜索篇 leetcode.509
从小白开始刷算法 记忆化搜索篇 leetcode.322

动态规划篇

难度:简单

题目:

509. 斐波那契数

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

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

题目来源:力扣(LeetCode)

动态规划介绍

动态规划是一种解决多阶段决策问题的优化方法,通过将问题划分为多个阶段,并记忆中间结果,以避免重复计算,从而降低问题的时间复杂度。

动态规划通常适用于具有重叠子问题和最优子结构性质的问题。重叠子问题指的是在问题的求解过程中,同样的子问题会被多次重复计算,而最优子结构指的是问题的最优解可以通过子问题的最优解来推导得出。

动态规划的基本思想是将原问题拆分为若干个子问题,先求解子问题的最优解,然后利用子问题的最优解构建原问题的解。在求解过程中,使用一个表格或数组来存储子问题的解,以便在需要时进行查找和使用。

动态规划的解决步骤通常包括以下几个阶段:

  1. 定义状态:将原问题划分为子问题,并确定状态变量,表示子问题的状态。
  2. 确定状态转移方程:根据子问题之间的关系,建立状态转移方程,表示当前状态与之前状态之间的关系。
  3. 初始化边界条件:确定初始状态的值或边界条件,作为递推的起点。
  4. 计算顺序:按照一定的计算顺序,从小规模的子问题开始逐步求解,直到解决原问题。
  5. 保存中间结果:为了避免重复计算,使用表格或数组等数据结构保存中间结果,以便在需要时进行查找和使用。

动态规划算法可以显著提高问题的求解效率,特别是对于具有重叠子问题和最优子结构性质的问题。它在各种领域中有广泛的应用,例如求解最短路径、最长公共子序列、背包问题、图论等。

动态规划思路

首先判断特殊情况,如果n小于等于1,则直接返回n,因为斐波那契数列的前两个数是0和1。

  1. 创建一个大小为n+1的数组dp,用于存储计算结果。
  2. 初始化dp数组的前两个元素,dp[0]为0,dp[1]为1。
  3. 使用循环从i=2开始,依次计算dp[i],即将前两个数的和赋给dp[i]。
  4. 循环结束后,dp[n]即为斐波那契数列的第n个数。
  5. 返回dp[n]作为结果。
// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
  public int fib(int n) {
      if(n<=1){
          return n;
      }
      int[] dp = new int[n+1];
      dp[0] = 0;
      dp[1] = 1;
      for (int i = 2; i <= n; i++) {
          dp[i] = dp[i-1]+dp[i-2];
      }
      return dp[n];
  }
}

时间复杂度:O(N)

空间复杂度:O(N)

其他思路

递归:

从小白开始刷算法 递归篇 leetcode.509

递归+记忆化搜索:

从小白开始刷算法 记忆化搜索篇 leetcode.509

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小大凳子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值