【Leetcode每日一刷】动态规划:509. 斐波那契数、322. 零钱兑换、300. 最长递增子序列

在这里插入图片描述

  • 博主简介:努力学习的22级计科生
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: LeetCode每日一题–进击大厂

在这里插入图片描述

前言:动规五部曲

以下是《代码随想录》作者总结的动规五部曲

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式(状态转移方程)
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

目录

  • 前言:动规五部曲
  • 1、509. 斐波那契数
  • 2、322. 零钱兑换
  • 3、300. 最长递增子序列

1、509. 斐波那契数

509. 斐波那契数

class Solution {
public:
    int fib(int n) {
        if(n==0||n==1) return n;
        //basic case
        int a0 = 0;
        int a1 = 1;

        int ai = 0;

        for(int i = 2; i <= n; i++){
            ai = a0+a1;//a[i] = a[i-2]+a[i-1]

            //滚动更新
            a0 = a1;
            a1 = ai;
        }
        return ai;
    }
};
  • 使用动态规划,转移方程为:a[i] = a[i-2]+a[i-1]
  • 由于斐波那契数列当前状态n只与n-2n-1有关,所以只需要开两个变量,存储两个状态即可,直接把空间复杂度从O(n)将为O(1)

2、322. 零钱兑换

322. 零钱兑换

🌻步骤

  1. dp数组以及下标含义:dp[i]表示目标金额为i时的,至少选择dp[i]枚硬币
  2. 状态转移方程
    在这里插入图片描述
  3. dp数组初识别
	//数组大小为amount+1,dp[i]初始化为amount+1(达不到的,初始化一个大的值)
	vector<int> dp(amount + 1, amount + 1)
	//base case
	dp[0] = 0;//目标金额为0,不用选择

为啥不直接初始化为 int 型的最大值 Integer.MAX_VALUE 呢?因为后面有 dp[i - coin] + 1,这就会导致整型溢出。

  1. 确定遍历顺序:自底向上

🏄🏻‍♀️完整代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {

        //1)dp数组初始化
        vector<int> dp(amount+1,amount+1);
        dp[0] = 0;

        //2)自底向上遍历(遍历子问题,求解子问题最优解)
        for(int i = 0; i <dp.size(); i++){

            //下面的for求出dp[i],外层循环结束,dp[amount]得解
            for(int coin : coins){
                if(i - coin < 0){//选择了面值为coin的硬币,子问题无解
                    continue;
                }
                dp[i] = min(dp[i],1 + dp[i-coin]);//状态转移方程
            }
        }

        return (dp[amount] == amount + 1 ? -1 : dp[amount]);

    }
};

3、300. 最长递增子序列

300. 最长递增子序列

🌷数学归纳法求解状态转移方程

  • 数学归纳法:假设在k<n时,结论成立,根据前面的假设,推出k = n时的结论。若能推出,则证明在k 为任何数时成立
  • 对应到动态规划:假设d[0] … d[i-1]已经全部推出,然后反问自己:能否根据已经推出来的d[i-1]等,计算d[i]🌟
  • ⭐前提:搞懂d[i]以及下标i的含义!

🌻步骤

  1. 确定dp[i]以及下标i的含义:
    我觉得这步是蛮难的其实。看了题解才知道,dp[i]代表以nums[i]结尾的最长递增子序列。(dp数组的最大值就是答案)
  2. 递推公式:
    求解dp[i],可以先找到序列尾元素小于nums[i]的dp[x](遍历即可),然后+1,再取最大值即可求得dp[i]。(递推过程)
  3. dp[i]数组初始化:dp[1~i] = 1(最不行也包括了自身!)
  4. 遍历顺序:自底向上(因为dp[i]需要前面确定了,才能确定!)

🏄🏻‍♀️完整代码

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        //dp数组的定义和初始化:dp[i]表示以num[i]结尾的最长递增子序列
        vector<int> dp(nums.size(),1);

        //遍历,自底向上,确定dp[i]的值
        for (int i = 0; i < nums.size(); i++){
            //假设以知1~i-1的dp值,通过递推求dp[i]
            for(int j = 0; j < i; j++){
                if(nums[j]<nums[i]){
                    dp[i] = max(dp[i],1+dp[j]);
                }
            }
        }

        //最终结果是dp数组中的最大值
        int ans = 0;
        for (int i = 0; i < nums.size(); i ++){
            ans = max(ans,dp[i]);
        }
        return ans;
    }
};

在这里插入图片描述

  • Java岛冒险记【从小白到大佬之路】
  • LeetCode每日一题–进击大厂
  • 算法
  • C/C++
  • Go语言核心编程
  • 数据结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT写小论文

ChatGPT写小论文 只是个人对写小论文心得?从知乎,知网自己总结的,有问题,可以留个言我改一下 文章目录 ChatGPT写小论文-1.写论文模仿实战(狗头)0.论文组成1.好论文前提:2.标题3.摘要4.关键词5.概述6.实验数据、公式或者设计7.结论&#xff0c;思考8.参考文献 0.模仿1.喂大纲…

【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

学习笔记-主成分分析法

定义 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;其能反映出原始数据的大部分信息。一般来说&#xff0c;当研究的问题涉及到多变量且变量之间存…

人机交互有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是几个人机交互领域的SCI期刊推荐&#xff1a; ACM Transactions on Computer-Human Interaction (ACM TOCHI)&#xff1a; 由ACM&#xff08;Association for Computing Machinery&#xff09;出版的人机交互领域的顶级期刊之一&#xff0c;发表关于计算机和人之间相互作…

如何以产品经理思维打造一所高品质学校?

学校的建设与管理真不是一件容易事。2023年03月17日&#xff0c;山东菏泽市曹县一家长投诉某中学课业繁重&#xff0c;孩子经常写作业到半夜&#xff1b;2023年4月4日&#xff0c;张先生在华龙网重庆网络问政平台投诉万州区某中学伙食差&#xff0c;指出“发灰的洋葱&#xff0…

【21】核心易中期刊推荐——人工智能 | 遥感图像识别

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

023:Mapbox GL加载mp4视频文件

第023个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载MP4视频文件。一个视频源。 “urls”值是一个数组。 对于数组中的每个 URL,将创建一个视频元素源。 要支持跨浏览器的视频,请提供多种格式的 URL。“坐标”数组包含按顺时针顺序列出的视频角的 [longi…

如何在 Java 8 中使用 Streams?结合多种案例剖析学习!

Java 8 Streams 是一个非常强大的功能&#xff0c;它提供了一种简洁、优雅的方式来处理数据集合。通过使用 Streams&#xff0c;我们可以轻松地过滤、映射、排序、聚合等操作数据。本教程将介绍 Streams 的基本概念&#xff0c;以及如何在 Java 8 中使用 Streams。本教程还包括…

LinkedHashMap如何实现LRU缓存淘汰策略?

本文目录 1.LRU是什么&#xff1f;2.如何使用LinkedHashMap实现LRU?3.LinkedHashMap源码分析3.1 LinkedHashMap简介3.2 继承体系3.3 内部数据存储结构3.4源码解析属性&#xff1a;构造方法&#xff1a;afterNodeInsertion(boolean evict)方法afterNodeAccess(Node e)方法after…

ChatGPT 简介

文章目录 一. 简介1. ChatGPT 概念1. ChatGPT 简介2. ChatGPT 可以做的事3. ChatGPT 名称详解4. ChatGPT 前世今生5. ChatGPT-5 受阻 2. 大模型概念3. 常见大模型4. 使用与限制5. 总结 一. 简介 1. ChatGPT 概念 1. ChatGPT 简介 ChatGPT&#xff1a;一款基于人工智能的聊天…

QMS-云质说质量 - 5 解决中小企业质量问题的钥匙在哪里?

云质QMS原创 转载请注明来源 作者&#xff1a;王洪石 引言 一个小小的质量问题可能引发蝴蝶效应 日常生活中&#xff0c;我们每天都会遇到各种各样的问题&#xff0c;并随着它们喜怒哀乐。企业也不例外&#xff0c;即使有很好的管理体系以及非常高素质的员工&#xff0c;一些错…

Vue3 + TS4.8踩坑之配置husky问题env: sh\r: No such file or directory

一、基本情况&#xff1a; 硬件环境&#xff1a;MacOS 10.14.6 背景&#xff1a; 1&#xff0c;用vue3官方npm init vuelatest初始化创建的vue3 ts4.8项目&#xff0c;IDE是 VS Cde 1.77.3版本 2&#xff0c;初始化项目之后给项目配置了.editorconfig&#xff0c;方便团队…

scratch电子画板 少儿编程 电子学会图形化编程scratch编程等级考试二级真题和答案解析2023年3月

目录 scratch电子画板 一、题目要求 1、准备工作 2、功能实现 二、案例分析

世界读书日|这些值得程序员反复阅读的经典书

2023年是第28个世界读书日&#xff0c;每年的这个时候&#xff0c;小编都会准备一份书单与您分享。 与经典同行&#xff0c;伴书香成长。小编今天推荐一份值得程序员反复阅读的经典书。 1、浪潮之巅 第四版 这不只是一部科技产业发展历史集…… 更是在这个智能时代&#xff…

CocosCreator实战篇 | 实现刮刮卡和橡皮擦 | 擦除效果

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/dxt19980308 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649; &#x1f4e2;生活依旧是美好而…

mysql数据库SQL语句orderBy排序同时limit分页出现数据重复问题

先说解决方案&#xff1a;排序中使用唯一值&#xff08;例如主键id&#xff09;&#xff0c;保证每条数据不重复 SELECT * FROM table WHERE 1 1 ORDER BY create_time,id DESC LIMIT 0, 10;1、问题 MySQL官方描述&#xff1a; 如果多行在列中具有相同的值ORDER BY&#xff…

Linux->管道和共享内存通信

目录 1 管道 1.1 管道是什么 1.1 匿名管道通信 1.2 父子进程通信 1.3 匿名管道实现多进程文件的写入读取 1.4 命名管道 2 共享内存 1 管道 1.1 管道是什么 管道顾名思义&#xff0c;他就是一个像是连通器一样的东西&#xff0c;原本不存在联系的东西之间建立起一定的关…

Blender3.5 边的操作

目录 1. 边操作1.1 边的细分 Subdivide1.2 边的滑移 Edge Slide1.3 边的删除1.4 边的溶解 Dissolve1.5 边线倒角 Bevel1.6 循环边 Loop Edges1.7 并排边 Ring Edges1.8 桥接循环边 1. 边操作 1.1 边的细分 Subdivide 在边选择模式&#xff0c;选中一条边&#xff0c;右键&…

Shell编程之条件语句

目录 一、条件测试 1&#xff09;test命令 ​编辑 2&#xff09;文件测试 常用的测试操作符 ​编辑 4&#xff09;整数值比较 常用的测试操作符 6&#xff09;逻辑测试 常用的测试操作符 7&#xff09;三元运算符 二、if语句 1&#xff09;单分支结构 2&#xff09…

Kubernetes快速部署

2 Kubernetes快速部署 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署&#xff1a; # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和…