LeetCode刷题笔记【35】:动态规划专题-7(爬楼梯、零钱兑换、完全平方数)

news2024/12/28 3:33:06

文章目录

  • 前置知识
  • 70. 爬楼梯 (进阶)
    • 题目描述
    • 解题思路
    • 代码
  • 322. 零钱兑换
    • 题目描述
    • 解题思路
    • 代码
  • 279.完全平方数
    • 题目描述
    • 解题思路
    • 代码
  • 总结

前置知识

今天的三道题都聚焦完全背包问题, 关于完全背包, 基础性的思路可以参考上一篇文章
本文的很多操作就是在完全背包的基础上进行修改.

参考文章:
LeetCode刷题笔记【29】:动态规划专题-1(斐波那契数、爬楼梯、使用最小花费爬楼梯)
LeetCode刷题笔记【30】:动态规划专题-2(不同路径、不同路径 II)
LeetCode刷题笔记【31】:动态规划专题-3(整数拆分、不同的二叉搜索树)
LeetCode刷题笔记【32】:动态规划专题-4(二维背包问题、一维背包问题、分割等和子集)
LeetCode刷题笔记【33】:动态规划专题-5(最后一块石头的重量 II、目标和、一和零)
LeetCode刷题笔记【34】:动态规划专题-6(完全背包、零钱兑换II、组合总合IV)

70. 爬楼梯 (进阶)

题目描述

在这里插入图片描述

LeetCode链接:https://leetcode.cn/problems/climbing-stairs/description/

解题思路

这道题我们之前有做过, 用的是简单动态规划的思想, 可以参考前文(点击文字跳转).

但是现在用完全背包的视角来看, 可以视为背包大小为n, 有大小为1和2的两种数量不限的物品, 要让我们求有多少种方法可以装满背包.

需要注意的点为:

  1. 递推公式为dp[j] = dp[j] + dp[j-i];
  2. dp[0] = 1;
  3. 因为要求的是排列, 所以外层遍历背包容量j, 内层遍历物品i

代码

动态规划代码:

class Solution {
public:
    int climbStairs(int n) {
        if(n==0 || n==1)
            return 1;
        int first=1, second=1;
        for(int i=2; i<=n; ++i){
            int tmp = first + second;
            first = second;
            second = tmp;
        }
        return second;
    }
};

完全背包代码:

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp(n+1, 0);
        dp[0] = 1;
        for(int j=1; j<=n; ++j){
            for(int i=1; i<=2; ++i){
                if(j-i>=0)
                    dp[j] = dp[j] + dp[j-i];
            }
        }
        return dp.back();
    }
};

可以看出: 完全背包解法的代码和注意事项都和<377. 组合总和 Ⅳ>很像.

322. 零钱兑换

题目描述

在这里插入图片描述

LeetCode链接:https://leetcode.cn/problems/coin-change/description/

解题思路

如果之前不了解动态规划和完全背包的话, 这道题难度是比较高的.
但是经历过之前这一波的毒打, 我们可以一眼看出这一定要用完全背包做(给无限量的xx, 需要凑齐xx量).

前面遇到过<518. 零钱兑换II>, 我们要注意对比这两道题, 会发现无论是初始化方式, 递推公式, 判断条件, 还有是否需要注意内外层顺序, 二者都有差别.

关键就是, <518. 零钱兑换II>要求的是"有多少种方法凑够", 而本题要求的是"凑够给定的数额最少需要多少"

需要注意的有这几点:

  1. 初始化时dp数组其他元素为INT_MAX, dp[0]=0;
  2. 递推公式为: dp[j] = min(dp[j], 1+dp[j-coins[i]]);
  3. 因为有无法填满背包的情况, 所以在过程中要加判断if(dp[j-coins[i]]!=INT_MAX)
  4. 要求的是"最少需要的硬币个数", 而不是"需要最少的硬币个数的组合/排列", 所以不用考虑内外层先遍历物品i还是背包容量j的问题, 怎么遍历结果都一样.

以题目中示例1为例, dp数组更新过程如下:
以题目中示例1为例
可以看到, 当时推导的时候还在右上角纠结了一下内外层, 其实没有必要, 都一样.

PS: 尤其需要注意的是第3点, 因为可能会有凑不齐的情况, 比如题目给的示例2和示例3, 以实例2为例:
在这里插入图片描述
只有加了if(dp[j-coins[i]]!=INT_MAX)的判断, 才可以将这种凑不齐的情况找出来, 并return -1

代码

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1, INT_MAX);
        dp[0] = 0;
        for(int i=0; i<coins.size(); ++i){
            for(int j=1; j<=amount; ++j){
                if(j-coins[i]>=0 && dp[j-coins[i]]!=INT_MAX){
                    dp[j] = min(dp[j], 1+dp[j-coins[i]]);
                }
            }
        }
        if(dp[amount]==INT_MAX)
            return -1;
        return dp[amount];
    }
};
// 优化了一下
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1, INT_MAX);
        dp[0] = 0;
        for(int i=0; i<coins.size(); ++i){
            for(int j=coins[i]; j<=amount; ++j){
                if(dp[j-coins[i]]!=INT_MAX){
                    dp[j] = min(dp[j], 1+dp[j-coins[i]]);
                }
            }
        }
        if(dp[amount]==INT_MAX)
            return -1;
        return dp[amount];
    }
};

279.完全平方数

题目描述

在这里插入图片描述

LeetCode链接:https://leetcode.cn/problems/perfect-squares/description/

解题思路

思路和上一题基本一样, 只不过是刚才的物品是coins, 现在物品是i*i, 并且因为有1*1=1, 所以不用考虑凑不齐的问题.

代码

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        vector<int> nums;
        for(int i=1; ; ++i){
            if(i*i <= n)
                nums.push_back(i*i);
            else
                break;
        }
        for(int i=0; i<nums.size(); ++i){
            for(int j=nums[i]; j<=n; ++j){
                dp[j] = min(dp[j], 1+dp[j-nums[i]]);
            }
        }
        return dp.back();
    }
};
// 让写法简洁一些
class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1, INT_MAX);
        dp[0] = 0;
        for(int i=1; i*i<=n; ++i){
            for(int j=i*i; j<=n; ++j){
                dp[j] = min(dp[j], 1+dp[j-i*i]);
            }
        }
        return dp.back();
    }
};

总结

今天是昨天的完全背包问题的进一步深化和拓展, 需要着重进行比较和辨析.
尤其是今天的零钱兑换, 和昨天的零钱兑换IV.

经过这段时间的背包问题折磨, 基本可以比较顺畅的想到背包问题了, 但是在实践过程中, 如何快速抽象出物品, 背包容量等要素, 同时避免"手里是锤子, 看啥都是钉子"的思维定式, 还是要在不断地训练中提升.

本文参考:
爬楼梯
零钱兑换
完全平方数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.Docker 搭建 redis6

1.下载redis docker pull redis:6.2.62.创建需要挂载的宿主机文件夹 mkdir -p /data/redis/conf mkdir -p /data/redis/data3.配置redis 切换到/data/redis/conf文件夹下&#xff0c;创建redis.conf,复制redis.conf配置文件内容到redis.conf文件中&#xff0c;然后按下键盘 …

多层包的java程序使用命令行编译、运行、打包

对于没有包层级的java程序&#xff0c;用命令行进行编译、运行、打包很简单。对于多层级包的java程序会有所不同。以如下程序为例 package HeadFirstJava.chapter01.guessGame;public class GameLanucher {public static void main(String[] args) {GuessGame game new Guess…

CentOS停服遭替代,这些操作差异,你了解了吗?

背景 随着 CentOS停服&#xff0c;各个行业的运维都在寻找各自的替代方案&#xff0c;考虑的出发点有&#xff1a; 新操作系统是否兼容CentOS&#xff0c;避免太大的操作差异&#xff1b; 新操作系统是否为信创&#xff0c;其具体收费情况如何&#xff1b; 新操作系统是否支…

亚马逊电子产品日本站PSE认证,TELEC认证如何办理?

日本市场准入认证——PSE认证&#xff0c;TELEC认证 日本作为第三大经济体国家&#xff0c;是中国商品对外出口的最多的国家之一&#xff0c;无论是在日本亚马逊销售还是在日本当地销售&#xff0c;都需要符合日本市场准入许可。需要注意的是日本的电气安全标准都是自主特色的…

2023最新站长必备在线工具箱系统源码优化修复版

2023最新站长必备在线工具箱系统源码 含上百款工具 带后台版本 自适应模板 优化修复版 搭建看了一下,系统一切正常可用,就是后台登录方式使用的是QQ扫码登录的,建议有能力的可以改一改 此工具箱系统源码还是比较成熟的&#xff0c;虽然没有那么花里胡哨&#xff0c;但贵在简洁大…

软件项目管理【第一章:软件项目管理概述/项目启动】

目录 一、软件项目管理概述 1.项目 2.项目管理 3.项目管理框架 3.整个软件项目管理概述 二、项目启动 1.项目类型 2.初始化项目分析 3.生存期模型(常用) 4.项目立项 一、软件项目管理概述 1.项目 项目的定义&#xff1a; 是为了创造一个唯一的产品或提供一个唯一的…

N9030B是德科技信号分析仪

181/2461/8938它能够实现对复杂信号的实时捕获、分析和处理。Keysight N9030B采用了最先进的技术和设计&#xff0c;为工程师和科学家们提供了一系列强大的功能&#xff0c;帮助他们更好地进行信号分析&#xff0c;以满足不断变化的应用需求。 Keysight N9030B采用了全新的硬件…

TensorFlow入门(十二、分布式训练)

1、按照并行方式来分 ①模型并行 假设我们有n张GPU,不同的GPU被输入相同的数据,运行同一个模型的不同部分。 在实际训练过程中,如果遇到模型非常庞大,一张GPU不够存储的情况,可以使用模型并行的分布式训练,把模型的不同部分交给不同的GPU负责。这种方式存在一定的弊端:①这种方…

COM组件IDispatch操作

IDispatch 组件接口&#xff0c;继承IUnkown&#xff0c;实现了反射机制&#xff0c;可以通过invoke调用dll函数 一般执行过程需要GetIDsOfNames、InvokeHelper函数执行&#xff0c;queryinterface查询获取对象 检查GetIDsOfNames返回的dispid是否正确 COleDispatchDriver 单…

Windows搭建FTP服务器

以win10为例&#xff1a; 安装FTP服务器支持和IIS管理平台。 设置->应用->程序与功能->启用或关闭windows功能-> Internet Infomation Services->勾选【FTP服务器】和Web管理工具的【IIS管理控制台】-> 点击确定等待安装完成。 打开IIS管理器 此电脑-右键…

微信小程序使用CryptoJS加密PassWord(MD5)

微信小程序使用CryptoJS加密PassWord(MD5) 背景及环境&#xff1a; 微信小程序登录页面&#xff0c;需要加密登录密码发送给后端&#xff0c;使用 MD5 来加密密码 开发工具&#xff1a;微信开发者工具 npm安装CryptoJS 查看有哪些crypto的包 npm search crypto 找到自己需要的包…

【AI】将图片制作成可编辑的图标

需要工具&#xff1a;QQ截图、AI描摹 图标网站&#xff1a;有用的网站收藏夹_h5动漫引擎-CSDN博客 第一&#xff1a;随便找个图标网站&#xff0c;选中自己需要的图标【付费的也可以】【肯定是图标越大越清晰】【此处做示范没用最大的图标】&#xff0c;用QQ截图&#xff08;…

微信小程序:实现列表单选

效果 代码 wxml <view class"all"><view class"item_all" wx:for"{{info}}" wx:key"index"><view classposition {{item.checked?"checked_parameter":""}} data-id"{{item.employee_num}}…

(五)Python字符串常用方法详解

在了解字符串的基本使用之后&#xff0c;本章将介绍 Python 字符串类型常用的几个方法。 在 Python 开发过程中&#xff0c;经常需要对字符串进行一些特殊处理&#xff0c;比如拼接字符串、截取字符串、格式化字符串等&#xff0c;这些操作无需开发者自己设计实现&#xff0c;…

[天翼杯 2021]esay_eval - RCE(disabled_function绕过||AS_Redis绕过)+反序列化(大小写wakeup绕过)

[天翼杯 2021]esay_eval 1 解题流程1.1 分析1.2 解题1.2.1 一阶段1.2.2 二阶段 二、思考总结 题目代码&#xff1a; <?php class A{public $code "";function __call($method,$args){eval($this->code);}function __wakeup(){$this->code "";…

学习记忆——数学篇——算术——无理数

谐音记忆法 2 \sqrt{2} 2 ​≈1.41421&#xff1a;意思意思而已&#xff1b;意思意思&#xff1b; 3 \sqrt{3} 3 ​≈1.7320&#xff1a;—起生鹅蛋&#xff1b;一起生儿&#xff1b; 5 \sqrt{5} 5 ​≈2.2360679&#xff1a;两鹅生六蛋(送)六妻舅&#xff1b;儿儿生&#xf…

Kafka的分布式架构与高可用性

导语 一开始我们就说过Kafka是一款开源的高吞吐、分布式的消息队列系统&#xff0c;那么今天我们就来说下它的分布式架构和高可用性以及双/多中心部署。 Kafka 体系架构简介 以下是 Kafka 的软件架构&#xff0c;整个 Kafka 体系结构由 Producer、Consumer、Broker、ZooKeepe…

小程序等轻应用技术是不是对企业有价值?

技术的持续迭代发展和用户使用习惯的养成&#xff0c;影响了企业业务载体和创新方式的改变。回看企业与用户交互技术载体的变革&#xff0c;发现曾经是PC软件&#xff0c;然后是网页&#xff0c;再后来是App&#xff0c;之后是小程序形态的轻应用。 移动互联网风起云涌的数十年…

【C语言】Linux平台下解析pcap文件

开发环境是readhat、ubuntu、kali 在wireshark上抓包需要使用 Wireshark/tcpdump/ 且 文件后缀名为.pcap 方式保存 效果如下&#xff1a; 引入俩文件如下。 my_pcap.h #pragma once #include <netinet/in.h>#define PCAP_MAGIC 0xa1b2c3d4typedef struct pcap_file_he…

TCP 和UDP通信流程

TCP 通信流程 根据上图可以看到&#xff0c;TCP 服务器和客户端通信分为 TCP 服务端和客户端&#xff0c;需要先建立服务 端然后再建立客户端与之连接进行数据交互。 服务端编程步骤&#xff1a; 1.使用 socket 创建流式套接字 2.使用 bind 绑定将服务器绑定到 IP 3.listen…