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

代码随想录打卡Day32

今天有点事,先做一题,剩下的明天补。

509. 斐波那契数

这道题目太简单了,递归几行代码就结束了,用动态规划做也可以,主要是学习一下动态规划五部曲。
这是递归的代码

class Solution {
public:
    int fib(int n) {
        //确定终止条件
        if(n == 0) return 0;
        if(n == 1) return 1;
        return fib(n - 1) + fib(n - 2); 
    }
};

这是动态规划的代码

class Solution {
public:
    int fib(int n) {
        //1.确定dp[i]的含义:斐波那契数列第i个数的值
        //2.确定递推公式  dp[i] = dp[i - 1] + dp[i - 2]
        //3.dp数组初始化 dp[0] = 0, dp[1] = 1
        //4.确定遍历顺序:从前往后遍历
        //5.打印数组(省略)
        if(n < 2) return n;
        //大于等于2的情况
        vector<int> dp(2);
        int sum;
        dp[0] = 0;
        dp[1] = 1;
        for(int i = 2; i <= n; i++){
            sum = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = sum;
        }
        return dp[1];
    }
};

先这样。


70. 爬楼梯

这道题目之前做过,印象非常深,因为当时还没刷代码随想录,第一次做这种动态规划题,非常烧脑。而且就算搞明白这个本质上是斐波那契数列以后,用递归也做不了,因为递归会超时。。。。爬到第i个台阶的方法数取决于爬到第i-1和i-2阶的方法数之和,就是纯纯的斐波那契数列啊。

class Solution {
public:
    int climbStairs(int n) {
        if(n <= 2) return n;
        vector<int> dp(3);
        dp[1] = 1;
        dp[2] = 2;
        int sum;
        for(int i = 3; i <= n; i++){
            sum = dp[1] + dp[2];
            dp[1] = dp[2];
            dp[2] = sum;
        }
        return dp[2];
    }
    
};


746. 使用最小花费爬楼梯

这道题目没有看讲解自己AC的,按照动态规划五部曲:
1.确定dp[i]的含义:爬到下标为i台阶所需的最小花费;
2.确定递推公式 dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
3.dp数组初始化 dp[0] = 0, dp[1] = 0 (因为开局选择起点的时候不需要花钱)
4.确定遍历顺序:从前往后遍历
5.打印数组(省略)
这道题的核心就在于递推公式的构建,不像之前两道题只是前两项相加那么简单,这道题还需要求二者之间的最小值。

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        //1.确定dp[i]的含义:爬到下标为i台阶所需的最小花费
        //2.确定递推公式  dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
        //3.dp数组初始化 dp[0] = 0, dp[1] = 1
        //4.确定遍历顺序:从前往后遍历
        //5.打印数组(省略)
        vector<int> dp(cost.size() + 1);
        dp[0] = 0;
        dp[1] = 0;
        int sum = 0;
        //总花费为dp[cost.size()]
        for(int i = 2; i <= cost.size(); i++){
            sum = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
            dp[i] = sum;
        }
        return dp.back();
    }
};

补完了,享受周末~


http://www.kler.cn/news/307580.html

相关文章:

  • Unity 使用Spine动画切换时有残影
  • VSCode创建C++项目和编译多文件
  • java发邮件内容含表格实现方法?如何配置?
  • sqlgun新闻管理系统
  • 本地部署大语言模型详细操作步骤
  • Y电容(安规电容)的作用是什么?
  • 【C++】queue和priority_queue
  • Linux:进程(一)
  • 无人机建模详解!!!
  • [Leetcode LCR 154][Medium]-复杂链表的复制-链表
  • JSON数组
  • 通信工程学习:什么是接入网(AN)中的CF核心功能
  • dplyr、tidyverse和ggplot2初探
  • 一些学习three的小记录
  • RK3588九鼎创展方案在Arm集群服务器的项目中的应用分析​​
  • 关于决策树集成的一份介绍
  • IDEA 新版本设置菜单展开
  • Python 单元测试详解:Unittest 框架的应用与最佳实践
  • java.人机猜拳游戏
  • JVM 性能优化与调优-Shenandoah GC
  • [K8S]Forbidden: pod updates may not change fields other than
  • 【Linux】NAT
  • 医学数据分析实训 项目三 关联规则分析预备项目---购物车分析
  • Django——多apps目录情况下的app注册
  • 在Ubuntu 16.04上安装R的方法
  • 题目:单调栈
  • SpringBoot用kafka.listener监听接受Kafka消息
  • 基于SpringBoot+Vue+MySQL的美术馆管理系统
  • 基于MySQL 8.0.39的高性能优化版将于10月份开源
  • 15. 三数之和(实际是双指针类型的题目)