代码随想录day38|| 322零钱兑换 279完全平方数 139单词拆分
322零钱兑换
力扣题目链接
题目描述:
给你一个整数数组 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
代码·:
class Solution {
public: int coinChange(vector<int>& coins, int amount) { // 创建一个大小为 amount + 1 的向量 dp,初始化为 amount + 1。 // 这里使用 amount + 1 是因为这是一个无法达到的最大值 (相当于无穷大)。 vector<int> dp(amount + 1, amount + 1); dp[0] = 0; // 当金额为0时,需要0个硬币。 // 遍历所有的硬币面额 for (int i = 0; i < coins.size(); i++) { // 对于每种硬币面额,更新 dp 表,以此每次可以选择当前硬币。 for (int j = coins[i]; j <= amount; j++) { // 这里选择当前硬币,并且计算选择当前硬币后可能达到的最小硬币数 dp[j] = min(dp[j], dp[j - coins[i]] + 1); } } // 如果 dp[amount] 仍然是 amount + 1,说明无法凑成目标金额,返回 -1; // 否则,返回组成目标金额的最小硬币数。 return dp[amount] > amount ? -1 : dp[amount]; }
};
/*dp[j] = min(dp[j], dp[j - coins[i]] + 1); 这段代码的性质:
dp[j]只有在合法的数据上+1才算是合法,dp数组里的所有的合法的数据都是在 dp[j - coins[i]] + 1合法的基础上得来的,如果 dp[j - coins[i]] + 1不合法,意思就是 dp[j - coins[i]] + 1=amount+2,此时dp[j]不变,还是amount+1,只有在dp[j - coins[i]]这个数据合法(就是小于不可能值amount+1)时才能进行数据的覆盖*/
1. 确定 dp 数组以及下标和对应值的含义
- dp 数组:dp[i] 表示凑成金额 i 所需的最少硬币个数。
- 下标 i:表示金额。
- dp[i] 值:最少的硬币数量,如果无法凑成该金额,初始化为一个无法到达的最大值,即 amount + 1。
2. 确定递推公式
- 公式:
dp[j] = min(dp[j], dp[j - coins[i]] + 1)
- 含义:不使用当前硬币
coins[i]
时,所需的硬币数为dp[j]
;使用当前硬币时,需要再加上一个coins[i]
,递推出dp[j - coins[i]] + 1
。
3. dp 数组如何初始化
- 初始化为
dp[0] = 0
,因为金额为0时不需要硬币。 - 其余的 dp 值初始化为
amount + 1
,代表无法达成或不可达(等效于无穷大)。
4. 确定遍历顺序
- 外层循环:遍历每种硬币(
for (int i = 0; i < coins.size(); i++)
),以便更新 dp 数组。 - 内层循环:从当前硬币的面额开始遍历到目标金额(
for (int j = coins[i]; j <= amount; j++)
),更新可以凑成金额 j 的最少硬币个数。
5. 举例推导 dp 数组
假设 coins = [1, 2, 5],amount = 11。
-
初始化:
dp = [0, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf]
-
使用面额 1:
- 更新 dp 值:
dp = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
- 更新 dp 值:
-
使用面额 2:
- 更新 dp 值:
dp = [0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6]
- 更新 dp 值:
-
使用面额 5:
- 更新 dp 值:
dp = [0, 1, 1, 2, 2, 1, 2, 2, 3, 3, 2, 3]
- 更新 dp 值:
最后,dp[11] = 3,表示使用面额 [1, 2, 5] 可以凑成11的最少硬币数量为3(例如 5 + 5 + 1)。
279完全平方数
力扣题目链接
题目描述:
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n =12
输出:3 解释:12 = 4 + 4 + 4
示例 2:
输入:n =13
输出:2 解释:13 = 4 + 9
代码:(跟上一题一摸一样,不再过多赘述)
class Solution {
public:int numSquares(int n) {vector<int> dp(n+1,n+1);dp[0]=0;dp[1]=1;for(int i=1;i<n;i++){for(int j=i*i;j<=n;j++){dp[j]=min(dp[j],dp[j-i*i]+1);}}return dp[n]>n? -1 : dp[n];}
};
139单词拆分
力扣题目链接
题目描述:
给你一个字符串 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
class Solution {
public: bool wordBreak(string s, vector<string>& wordDict) { // 将 wordDict 中的单词放入一个集合 wordSet 中,以便快速查找。 set<string> wordSet(wordDict.begin(), wordDict.end()); // 创建一个布尔型的 dp 数组,表示直到索引 i 的子字符串 s[0...i-1] 是否可以被字典中的单词组合而成。 vector<bool> dp(s.size() + 1, false); // 空字符串可以被认为是可以被组合而成的,故 dp[0] 初始化为 true。 dp[0] = true; // 遍历字符串 s 的每一个位置,计算到该位置是否可以被字典单词组合而成。 for (int i = 1; i <= s.size(); i++) { // 遍历“背包”(即目标字符串的内容) for (int j = 0; j < i; j++) { // 遍历“物品”(即目标字符串的前缀子字符串) // 从索引 j 开始,截取长度为 (i-j) 的字符串。 string word = s.substr(j, i - j); // 检查当前子串 word 是否在字典中,并且 dp[j] 为 true,表示 [0...j) 这一子串可被组合而成。 if (wordSet.find(word) != wordSet.end() && dp[j]) { dp[i] = true; // 如果条件满足,设置 dp[i] 为 true (当前子串 [0...i) 可以被组合而成) break; // 找到可以组合方式后,结束本轮内部循环 } } } // 返回 dp 最后一个位置的值,这反映了整个字符串是否可以被组合而成。 return dp[s.size()]; }
};
1. 确定 dp 数组以及下标和对应值的含义
- dp 数组:dp[i] 表示子字符串 s[0...i-1] 是否可以被字典中的单词组合而成。
- 下标 i:表示字符串中位置 (从 1 开始),即上限是第i个子串。
- dp[i] 值:布尔值,表明 s[0...i-1] 是否能够由字典中的单词组成。
2. 确定递推公式
- 公式:
dp[i] = true if ∃ j (0 ≤ j < i), dp[j] && (s[j...i-1] ∈ wordSet)
- 含义:如果从索引 j 到 i-1 的子串是字典中的单词,并且 s[0...j-1] 可以被组合而成,那 s[0...i-1] 也可以组合而成。
3. dp 数组如何初始化
- dp[0] = true,因为空字符串可以被认为是已组合完成。
4. 确定遍历顺序
- 外层循环:i 从 1 到 s.size(),代表当前考核的终止位置。
- 内层循环:j 从 0 到 i-1,考察前 j 个字符是否可以被组合而成及其后的字符组合可能。
5. 举例推导 dp 数组
假设 s = "leetcode",wordDict = ["leet", "code"]。
dp = [true, false, false, false, true, false, false, false, true]
- 解释推导:
dp[0] = true
(空字符串被认为可以组合)- 从 j=0 到 j=3,"leet" 在 wordDict 中,所以
dp[4] = true
- 从 j=4 到 j=7,对于
s[4..7]
,即 "code",也是在 wordDict 中,dp[8] = true
最终,dp[8] = true,说明整个字符串可以被组合而成。
if (wordSet.find(word) != wordSet.end() && dp[j]) {
dp[i] = true;
而&&dp[j] 就是判断这个字符串是否连接上了,而不是单独的判断这个截取的字段存在不存在
与dp[j - coins[i]] + 1有异曲同工之处
相关文章:

代码随想录day38|| 322零钱兑换 279完全平方数 139单词拆分
322零钱兑换 力扣题目链接 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,…...

Cesium天空盒子(Skybox)制作(js代码)和显示
介绍 在Cesium中,星空背景是通过天空盒子方式(6张图片)来显示的,原生的图片分辨率太低,本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个),格式为jpg,总共的恒星数目约为…...

JAVA中的缓冲流BufferedInputStream
在Java中,BufferedInputStream 是一种用于包装其他输入流(如 FileInputStream)的过滤流。它通过内部缓冲区机制提高了输入流处理的效率。使用缓冲流可以减少读取数据的次数,因为每次从输入流读取数据时,BufferedInputS…...

WindowContainerTransaction类详解(一)
1、WindowContainerTransaction是什么: windowContainerTransaction类的对象是用来存储对windowContainer的修改的一个集合,windowContainer。因为应用侧是无法直接操作windowContainer的,如果应用侧需要修改windowContainer的话,…...

安装NFS扩展
#添加helm源 helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner #创建个namespace(可选,主要是为了查看资源方便) kubectl create ns nfs-sc-default #使用helm安装(10.1.129.86为NFS地址,/home/data/nfs…...

计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时,都要使用协议栈中的运输层;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1:我们…...

代码随想录算法训练营第一天 | 二分查找
文章目录 Leetcode704 二分查找二分法的使用前提:区间选择其他注意事项 Leetcode27 移除元素解题思路:优化思路 Leetcode704 二分查找 链接:https://leetcode.cn/problems/binary-search/ 代码随想录: https://programmercarl.com/ 时间复杂度: O(logN) 空间复杂度:…...

python相关知识
1、注释 共有三种:#、 、””” ””” 2、数据类型 整数、浮点、字符串、布尔、列表、元组、集合、字典 num1 666、num2 3.14、t1 True、t2 False、 列表:list [1,2,3,4] 元组:tuple (11,aaa,ddd,3) 字典:dict {li…...

Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录
ANSI C程序中,用到了wcsrchr、wcsncpy_s、wcscat_s、wcscpy_s等几个字符串函数,但是编译时提示: 错误 LNK2001 无法解析的外部符号 _wcscat_s 查了挺多帖子,没有解决。 https://bbs.csdn.net/topics/250012844 解决VS编译…...

Java高并发处理机制
高并发处理的思路: 扩容:水平扩容、垂直扩容缓存:将基础的数据放入缓存进行处理使用SpringCloud的注册中心,分服务注册到同一个注册中心,服务器检测使用Spring的熔断操作,检测服务器的心跳那个正常随机跳转…...

7 数据存储单位,整型、浮点型、字符型、布尔型数据类型,sizeof 运算符
目录 1 数据类型的分类 2 数据存储单位 2.1 位 2.2 字节 2.3 其余单位 3 整数类型 3.1 基本介绍 3.2 整型的类型 3.2.1 整数类型多样性的原因 3.2.2 整型类型之间的相对大小关系 3.3 整型注意事项 3.4 字面量后缀 3.5 格式占位符 3.6 案例:声明并输出…...

导游职业资格考试真题题库
导游职业资格考试真题题库 80.重庆有"雾都"之称。壁山区的()全年雾日多204天,堪称"世界之最"。 A.枇杷山 B.雾灵山 C.云雾山 D.四姑娘山 答案:C 81.我国最具热带海洋气候特色的地方为()。 A.广西壮族…...

【Rust】使用开源项目搭建瓦片地图服务
本文通过获取在线和离线地图数据,使用开源Rust项目搭建瓦片地图服务,并使用DevExpress的MapControl控件使用自建地图服务 获取地图数据 获取地图数据有很多种方式,这里分别用在线和离线地图数据举例说明 在线下载瓦片地图 打开在线瓦片地…...

【面试宝典】mysql常见面试题总结(上)
一、MySQL 中有哪几种锁? MySQL中的锁机制是数据库并发控制的重要组成部分,它用于管理多个用户对数据库资源的访问,确保数据的一致性和完整性。MySQL中的锁可以根据不同的分类标准进行分类,以下是一些常见的分类方式及对应的锁类…...

第1章 初识C语言
第1章 初识C语言 1.1 C语言概述 1.1.1 C语言的发展历史 C语言的原型为ALGOL 60语言(也称A语言)。 1963年 剑桥大学将ALGOL 60语言发展成为GPL语言。 1967年 剑桥大学的Matin Richards简化GPL,产生了BGPL语言。 1970年 美国贝尔实验室的Ken…...

【考研数学】定积分应用——旋转体体积的计算(一文以蔽之)
目录 一、如何计算旋转体体积?思考一个小例子 二、旋转体体积的二重积分表达式 三、用真题,小试牛刀 定积分的应用中,有一类题是求解旋转体的体积问题。 相较于记忆体积计算公式,有一种通法求解体积更不容易出错:二重…...

PHP移动端商城分销全平台全端同步使用
📱【掌中购物新纪元:探索移动端购物商城系统的无限魅力】🛍️ 🚀 随时随地,购物自由新体验 在这个快节奏的时代,移动端购物商城系统彻底颠覆了传统购物方式,让消费者享受到了前所未有的便捷与…...

TLE8386-2EL:汽车级DC-DC转换器中文资料书
描述 TLE8386-2EL是一款具有内置保护功能的低端感应升压控制器。该器件的主要功能是将输入电压升高(升压)到更大的输出电压。开关频率可从100kHz调整至700kHz,并可与外部时钟源同步。 TLE8386-2EL的独特功能可将关断电流消耗降至 <2μA。该…...

EasyRecovery17中文mac苹果电脑版数据恢复软件 永久免费破解版下载
🎉 数据丢失不再是噩梦!EasyRecovery17中文版来拯救你的硬盘啦! 各位小伙伴们,有没有遇到过重要文件一不小心就消失无踪的尴尬情况?别担心,今天就给大家种草一款神奇的工具——EasyRecovery17中文版&#x…...

Ubuntu 22.04 安装 VirtualBox7
Ubuntu默认库为VirtualBox-6版本 # 安装 VirtualBox-6 sudo apt update sudo apt install virtualbox# 卸载 VirtualBox-6 sudo apt remove --purge --auto-remove virtualbox virtualbox-6.1 1. 安装 VirtualBox-7 # 导入软件包密钥 curl https://www.virtualbox.org/downl…...

NPM使用教程:从入门到精通
NPM使用教程:从入门到精通,掌握Node.js包管理神器 引言 随着Node.js的流行,JavaScript已经成为服务器端开发的主力军。NPM(Node Package Manager)作为Node.js的官方包管理工具,为开发者提供了一个庞大的代…...

模电实验3 - 单电源集成运放交流耦合放大器
实验目标 学习集成运放的单电源使用。掌握交流耦合单电源集成运放放大器的测试方法。了解交流耦合单电源集成运放放大器的特点。 实验器材 ADALM2000 1kΩ 电阻 (1/4 W) x 1 10 kΩ 电阻 (1/4 W) x 1 100kΩ 电阻 (1/4 W) x 3 0.1μF电容 x 1 1μF电容 …...

海对外经贸大学学报
《上海对外经贸大学学报》创刊于1994年,原名为《世界贸易组织动态与研究》(上海对外贸易学院学报),随原上海对外贸易学院更名为上海对外经贸大学,自2014年起更为现名,现为综合性社科类双月刊,为中文社会科学引文检索&a…...

数字化营销在公域场景中的无限可能
在如今的商业领域,公域场景为企业提供了广阔的发展空间,而数字化营销则成为了企业在这些场景中脱颖而出的关键利器。 一、电商平台营销 当企业在淘宝、京东等大型电商平台开设店铺,数字化营销便开始大显身手。 企业不仅能踊跃参与像双十…...

聚观早报 | 一加13配置细节曝光;谷歌首推人工智能手机
聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 8月15日消息 一加13配置细节曝光 谷歌首推人工智能手机 MONA M03汽车即将上市 iPhone SE 4将升级8GB运行内存 R…...

C++ 11相关新特性(lambda表达式与function包装器)
目录 lambda表达式 引入 lambda表达式介绍 lambda表达式捕捉列表的传递形式 lambda表达式的原理 包装器 包装器的基本使用 包装器与重载函数 包装器的使用 绑定 C 11 新特性 lambda表达式 引入 在C 98中,对于sort函数来说,如果需要根据不同的比较方式实现…...

FastAPI部署大模型Llama 3.1
项目地址:[self-llm/models/Llama3_1/01-Llama3_1-8B-Instruct FastApi 部署调用.md at master datawhalechina/self-llm (github.com)](https://github.com/datawhalechina/self-llm/blob/master/models/Llama3_1/01-Llama3_1-8B-Instruct FastApi 部署调用.md) …...

C++拾趣——编译器预处理宏__COUNTER__的应用场景
大纲 生成唯一标识符调试信息宏展开模板元编程代码 在C中,__COUNTER__是一个特殊的预处理宏,它主要被用来生成唯一的整数标识符。这个宏是由一些编译器(如GCC和Visual Studio)内置支持的,而不是C标准的一部分。它的主要…...

使用HTML和cgi实现网页登录功能
0.HTML文件结构 一.HTML文件 1.test.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>菜鸟教程(runoob.com)</title></head><body><!-- 将结果提交给/cgi-bin/test.cgi下 --><form actio…...

Java流程控制01:用户交互Scanner
本节教学视频链接:https://www.bilibili.com/video/BV12J41137hu?p33&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p33&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Scanner 类用于扫描输入文本从字符串中提…...