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

简介: 从小白开始刷算法 动态规划篇 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

相关文章
|
1月前
|
存储 算法
深入了解动态规划算法
深入了解动态规划算法
50 1
|
1月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
37 0
|
22天前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
53 2
动态规划算法学习三:0-1背包问题
|
19天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
21 2
|
22天前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
57 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
22天前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
85 0
动态规划算法学习二:最长公共子序列
|
1月前
|
存储 人工智能 算法
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
|
22天前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
82 0
|
1月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)