代码随想录算法训练营第四十一天| 509. 斐波那契数 、70. 爬楼梯 、746. 使用最小花费爬楼梯

509. 斐波那契数

题目链接:509. 斐波那契数

文档讲解:代码随想录/斐波那契数

视频讲解:视频讲解-斐波那契数

状态:已完成(1遍)

解题过程

看到题目的第一想法

虽然看了卡哥的动态规划五部曲,但是看到题目之后还是不太会操作索性不要有自己多余的思考了,直接看视频讲解。

看完代码随想录之后的想法

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dpi的定义为:第i个数的斐波那契数值是dpi

  2. 确定递推公式:dpi = dpi - 1 + dpi - 2;

  3. dp数组如何初始化:dp0 = 0 、dp1 = 1;

  4. 确定遍历顺序:从递归公式dpi = dpi - 1 + dpi - 2;中可以看出,dpi是依赖 dpi - 1 和 dpi - 2,那么遍历的顺序一定是从前到后遍历的;

  5. 举例推导dp数组:

    按照这个递推公式dpi = dpi - 1 + dpi - 2,我们来推导一下,当N为10的时候,dp数组应该是如下的数列:0 1 1 2 3 5 8 13 21 34 55。

看了讲解手搓代码如下:

javascript 复制代码
/**
 * @param {number} n
 * @return {number}
 */
var fib = function(n) {
    let dp = [];
    dp[0] = 0,dp[1] = 1;
    for(let i = 2;i<=n;i++){
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
};

总结

这道题作为动态规划之所以简单,是因为递推公式、初始化、遍历顺序都已经由题目确定。


70. 爬楼梯

题目链接:70. 爬楼梯

文档讲解:代码随想录/爬楼梯

视频讲解:视频讲解-爬楼梯

状态:已完成(1遍)

解题过程

看到题目的第一想法

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dpi的定义为:到第i层阶梯有dpi种方式能够来到;

  2. 确定递推公式:dpi = dpi - 1 + dpi - 2;

  3. dp数组如何初始化:dp0 = 1 、dp1 = 1、dp2 = 2;

  4. 确定遍历顺序:从递归公式dpi = dpi - 1 + dpi - 2;中可以看出,dpi是依赖 dpi - 1 和 dpi - 2,那么遍历的顺序一定是从前到后遍历的;

  5. 举例推导dp数组:

    按照这个递推公式dpi = dpi - 1 + dpi - 2,我们来推导一下,dp数组应该是如下的数列: 1 1 2 3 5 8 13 21 34 55。

手搓代码如下:

javascript 复制代码
/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    let dp = [1,1];
    for(let i =2;i<=n;i++){
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
};

提交成功!

看完代码随想录之后的想法

严格遵守对dpi的描述,直接没有i=0的时候。

讲解代码如下:

javascript 复制代码
/**
 * @param {number} n
 * @return {number}
 */
var climbStairs = function(n) {
    // dp[i] 为第 i 阶楼梯有多少种方法爬到楼顶
    // dp[i] = dp[i - 1] + dp[i - 2]
    let dp = [1 , 2]
    for(let i = 2; i < n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2]
    }
    return dp[n - 1]
};

总结

一开始我就往动态规划的思路上靠,感觉既然只有两种行走方式,那到dpi级阶梯的方式肯定就是他的下一级dpi-1和下两级dpi-2,所以到这级阶梯的方式就是到下两级阶梯方式的和。


746. 使用最小花费爬楼梯

题目链接:746. 使用最小花费爬楼梯

文档讲解:代码随想录/使用最小花费爬楼梯

视频讲解:视频讲解-使用最小花费爬楼梯

状态:已完成(1遍)

解题过程

看到题目的第一想法

用动态规划五部曲:

  1. 确定dp数组以及下标的含义:dpi的定义为:从第i层阶梯出发的最小花费dpi元;

  2. 确定递推公式:dpi = dpi - 1 和 dpi - 2 的最小值 + costi;

  3. dp数组如何初始化:dp0 = cost0 、dp1 =cost1 ;

  4. 确定遍历顺序:从递归公式中可以看出,dpi是依赖 dpi - 1 和 dpi - 2,那么遍历的顺序一定是从前到后遍历的;

  5. 举例推导dp数组:

    按照这个递推公式我们来推导一下,dp数组应该是如下的数列: 10 15 30 。

手搓代码如下:

javascript 复制代码
/**
 * @param {number[]} cost
 * @return {number}
 */
var minCostClimbingStairs = function(cost) {
    let dp = [cost[0],cost[1]];
    for(let i =2;i<cost.length;i++){
        dp[i] = Math.min(dp[i - 1],dp[i - 2]) + cost[i];
    }
    return Math.min(dp[cost.length-1],dp[cost.length-2]);
};

提交成功,没有问题。 我在求最后一级阶梯的时候就不用走for循环里了,直接比较从前两节阶梯哪个出发更便宜。

看完代码随想录之后的想法

卡尔哥用dpi表示到达第i节阶梯的最便宜花费,确实省事一点。

讲解代码如下:

javascript 复制代码
/**
 * @param {number[]} cost
 * @return {number}
 */
var minCostClimbingStairs = function(cost) {
  const dp = [0, 0]
  for (let i = 2; i <= cost.length; ++i) {
    dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
  }
  return dp[cost.length]
};

总结

今天的三道题还算简单,希望明后天可以撑住。

相关推荐
AndrewHZ1 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场2 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾3 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI3 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
小程故事多_803 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
Hi李耶4 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
shylyly_4 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
AI科技星4 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
沐籽李5 小时前
HuDiff在抗体人源化项目中的工程化落地
人工智能·算法·aidd·抗体设计