【代码随想录训练营第42期 Day38打卡 - 动态规划Part6 - LeetCode 322. 零钱兑换 279.完全平方数 139.单词拆分

目录

一、做题心得

二、题目与题解

题目一:322. 零钱兑换

题目链接

题解:动态规划--完全背包 

题目二: 279.完全平方数

题目链接

题解:动态规划--完全背包

题目三:139.单词拆分

题目链接

题解:动态规划--完全背包

三、小结


一、做题心得

今天来到了代码随想录动态规划章节的Part6,依旧是完全背包问题的应用。相对于前边直接套用模板,今天的题目难度相对较大一点,尤其是单词拆分这道题,bool型dp数组的使用,和之前做的题就有很大的不同。

话不多说,直接开始今天的内容。

二、题目与题解

题目一:322. 零钱兑换

题目链接

322. 零钱兑换 - 力扣(LeetCode)

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104
题解:动态规划--完全背包 

这道题属于是完全背包求最值问题--求得凑成总金额所需的最少得硬币数量,当然,本质上讲,也是组合数问题。

首先就是dp数组的定义与初始化:dp[j]表示凑成金额 j 所需的最少硬币数量--注意:dp[j]必须初始化为一个较大的数,以防在后续min()函数处直接被初始值覆盖,还有就是初始化 dp[0] = 0

然后就是这道题的关键部分:如果存在一种或多种方式可以组成金额 j - coins[i],那么加上一个coins[i]之后就可以凑成金额 j。

这里直接看代码(含注释):

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);        //dp[j]表示凑成金额 j 所需的最少硬币数量--注意:dp[j]必须初始化为一个最大的数,以防在后续min()函数处直接被初始值覆盖dp[0] = 0;          //初始化dp[0]为0,表示组成金额0不需要任何硬币for (int i = 0; i < coins.size(); i++) {            //先遍历物品再遍历背包(先遍历背包也可以)for (int j = coins[i]; j <= amount; j++) {              //正序遍历背包(金额)-- 表示可重复使用硬币:注意,这里从coins[i]开始遍历,因为如果金额小于当前硬币的面值,那么当前硬币无法使用(保证j - coins[i]大于0)if (dp[j - coins[i]] != INT_MAX) {      //说明存在一种或多种方式可以组成金额 j - coins[i] ,这时再加上一个当前硬币 coins[i],就可以组成金额 j -- 间接性说明此时可以凑成总金额dp[j] = min(dp[j - coins[i]] + 1, dp[j]);       //不断更新凑成金额 j 所需的最少的硬币个数}}}if (dp[amount] == INT_MAX) {      //没有任何一种硬币组合能组成总金额amountreturn -1;}else    return dp[amount];}
};

题目二: 279.完全平方数

题目链接

279. 完全平方数 - 力扣(LeetCode)

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12输出:3 解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13输出:2解释:13 = 4 + 9
 

提示:

  • 1 <= n <= 104
题解:动态规划--完全背包

这道题和上一道零钱兑换思路上基本一致,需要注意的就是如何实现完全平方数的列举。

这里先看看我的代码:

 直接新建一个数组,存放每个数字的平方即可。-- 显然,这样时间复杂度和空间复杂度都加大了。

我们可以直接在遍历物品与背包的过程中实现对完全平方数的操作。

如下是修改后的代码:

class Solution {
public:int numSquares(int n) {/* 完全背包问题--一维dp */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++) {      //正序遍历背包--这里的for循环直接实现了j为完全平方数dp[j] = min(dp[j - i * i] + 1, dp[j]);}}return dp[n];}
};

题目三:139.单词拆分

题目链接

139. 单词拆分 - 力扣(LeetCode)

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。注意,你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • s 和 wordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同
题解:动态规划--完全背包

这道题实际上的意思就是判断是否能从字典中选择单词构成字符串s -- 需要注意的就是每个单词可以重复使用,而为了构成字符串,一定是讲求顺序的 -- 这就容易联想到完全背包的排列数问题

在这里,就应该定义bool类型的dp数组,dp[i]表示字符串s的前i个字符是否可以被拆分成若干个字典(wordDict)中出现的单词。

初始化整个 dp 数组为 false,而 dp[0] = true。

排列数问题--先背包再物品,这里用到了str()函数,用于截取字符串的子串部分(这里需要注意子串部分的长度),判断是否有某个单词与之匹配。

代码如下:

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(s.size() + 1, false);          //定义bool类型的dp数组,dp[i]表示字符串s的前i个字符是否可以被拆分成若干个字典(wordDict)中出现的单词dp[0] = true;       //初始化dp[0] = 0/*  排列数问题--先背包再物品  */for(int i = 1; i <= s.size(); i++) {            //正序遍历字符串s(背包)    for(auto word: wordDict) {          //遍历单词(物品):这样写更直观int size = word.size();    //记录当前单词长度(背包问题中的物品体积)   if ((i - size) >= 0 && s.substr(i - size, size) == word) {        //从s中提取的子字符串s.str(i - size, size)和字典中当前单词 word 匹配时--注意这里需要保证(i - size) >= 0即str(start, len)提取子串的初始位置start不能为负dp[i] = dp[i] || dp[i - size];       //表示如果 dp[i - size] 为真,则 dp[i] 也应为真 }}       }return dp[s.size()];        //整个字符串进行判断}   
};

三、小结

今天的打卡到此也就结束了,完全背包问题暂时也就告一段落,后边会继续加油!

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

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

相关文章

qt-16可扩展对话框--隐藏和展现

可扩展对话框 知识点extension.hextension.cppmain.cpp运行图初始化隐藏展现--点击--详细按钮 知识点 MainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小 extension.h #ifndef EXTENSION_H #define EXTENSION_H#include <QDialog>class Extens…

你是如何更精准地指引模型,激发其无尽的创造力?

随着大型语言模型日益凸显其重要性&#xff0c;发掘并充分利用它们的潜力&#xff0c;很大程度上依赖于我们如何巧妙构思和构造指令——即Prompt的精炼艺术。优化Prompt撰写技巧&#xff0c;将能够更好地引导大模型&#xff0c;为各类应用场景生成高质量的文本输出。分享出你的…

【STM32】C语言基础补充

学习过程中发现自己好些需要用到的C语言语法、特征都不太熟练了&#xff0c;特意记录一下&#xff0c;免得忘记了&#xff0c;以后遇到了新的也会继续更新 目录 1 全局变量 2 结构体 3 静态变量 4 memset()函数 5 使用8位的存储器存16位的数 1 全局变量…

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑&#xff0c;提示如下&#xff0c;但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件&#xff1b; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…

Keil C51 插件 快速复制一行

此插件解决的问题 目前 Keil 软件 只可以 先选中一行&#xff0c;再Ctrl C Ctrl V , 太麻烦了 Keil 插件 -- Python 代码 import sys# 插入当前行内容 def insert_line(current_file_path, line_number):line_to_insert # 读取文件内容with open(current_file_path, r, enc…

微信小游戏授权问题

微信小程序获取用户相关信息的接口&#xff0c;如wx.getUserCloudStorage&#xff0c;报错&#xff1a;please go to mp to announce your privacy usage。 需要在微信公众平台设置用户隐私保护。

APP支付宝授权获取code uniapp

1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权&#xff0c;在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例&#xff0c;需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…

OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程

OpenDDS中,实现了Rtps_Udp传输协议(非纯udp)的可靠性传输。传输的线程包括: 1)发送方线程主要线程和定时器 《1》应用线程 《2》网络异步发送线程 《3》Heartbeat定时器 《4》Nak_response定时器 2)接收方主要线程和定时器 《1》网络异步接收线程 《2》heartbeat_respons…

Ubuntu 16.04 通过deb包安装内核头文件

文章目录 前言通过deb包安装内核头文件 前言 Ubuntu16.04部分内核版本无法通过 apt-get install linux-headers-$(uname -r) 来进行安装&#xff1a; # cat /etc/lsb-release DISTRIB_IDUbuntu DISTRIB_RELEASE16.04 DISTRIB_CODENAMExenial DISTRIB_DESCRIPTION"Ubuntu…

汇编

汇编指令 随机数mov指令mov指令ldr指令&#xff08;伪指令&#xff09;add指令sub指令bic指令orr指令b指令cmp指令stmfd指令ldmfd指令import栈汇编指令的s后缀 随机数 1.如果某个数的数值范围是0~255之间&#xff0c;那么这个数一定是立即数&#xff1b; 2.把某个数展开成2进制…

网络工程师必备10个Linux网络命令,超好用

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友 掌握正确的工具对于提升工作效率的重要性不言而喻&#xff0c;尤其在网络工程领域&#xff0c;这一点更是至关重…

尚品汇-购物车列表、临时用户购物车与登录用户购物车合并实现(三十七)

目录&#xff1a; &#xff08;1&#xff09;功能—展示购物车列表 &#xff08;2&#xff09;在web-all添加前端实现 &#xff08;3&#xff09;功能--合并购物车 &#xff08;1&#xff09;功能—展示购物车列表 购物车列表接口&#xff1a;CartService /*** 通过用户Id …

买完服务器后,如何部署项目|如何通过宝塔部署项目

一、前言 很多人都会在腾讯云、阿里云等平台上买服务器&#xff0c;但是买了服务器后&#xff0c;不知道接下来要干什么&#xff0c;或者是怎么部署项目。 买完服务器后&#xff0c;第一步就是再买一个数据盘&#xff0c;然后将数据盘挂载到服务器上&#xff0c;不知道教程的…

Vue: v-html安全性问题

一、问题描述 可能都知道使用v-html插入富文本&#xff0c;存在安全隐患&#xff0c;比如 cross-site scripting attack&#xff08;xss&#xff09;。但具体什么情况下v-html会引发安全问题呢&#xff1f;是否内容中含有<scrpit>标签就会触发执行脚本呢&#xff1f; 二…

【Unity3D小技巧】Unity3D中实现对InputField的自定义输入限制实例

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 InputField是UGUI的文本输入框&#xff0c;自带的…

eNSP的使用和下载安装

有小伙伴想考数通的HCIP的或有网络问题的可以进群讨论 找志同道合的人,一起讨论问题 很多小伙伴在安装eNSP的时候出现过很多问题,为了后续我们的专题能进行,这里提前教大家如何下载eNSP 大家可以参考这位大佬的安装,非常的详细 华为 eNSP 模拟器安装教程&#xff08;内含下载地…

dokcer 安装 redis(单机版)

准备工作 拉取redis镜像 docker pull redis 通过docker-compose 安装redis 很方便、很简单 先安装docker&#xff0c;参考我这个安装示例进行安装 https://blog.csdn.net/qq_33192671/article/details/13714973 然后安装docker-compose&#xff0c;要是拉取docker-compose无…

[Meachines] [Easy] grandpa IIS 6.0+CVE-2017-7269+MS14-070权限提升

信息收集 IP AddressOpening Ports10.10.10.14TCP:80 $ nmap -p- 10.10.10.14 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 6.0 |_http-server-header: Microsoft-IIS/6.0 |_http-title: Under Construction | htt…

14-17岁未成年如何办理能一直用的手机卡?

14-17岁未成年如何办理能一直用的手机卡&#xff1f; 有些姐妹要去外面上学&#xff0c;都想要一张属于自己的手机卡。 但是因为反诈的原因&#xff0c;对于手机卡的申领特别严格。 很多不满18岁的人能申领的卡&#xff0c;都是物联卡或者纯流量卡&#xff0c;只能上网&#x…

Promise学习之同步与异步

目录 前言 一、同步与异步 (一) 同步 (二) 异步 二、总结 (一) 同步 (二) 异步 前言 Java有多线程&#xff0c;前端有同步与异步&#xff0c;异步操作可以优化用户体验、提高性能与响应、处理并发与并行任务等等&#xff0c;异步操作有发送Ajax请求、读文件等&#xff0…