代码随想录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…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
