代码随想录算法训练营Day25 | 216.组合总和III、17.电话号码的字母组合
216.组合总和III
与77.组合差不多,就返回条件中收集结果步骤多了一步判断,同时剪枝策略多了一种
vector<vector<int>> ans;
vector<int> path;
int sum = 0;void backtracking(int num, int& k, int& n) {if (path.size() == k) {if (sum == n)ans.push_back(path);return;}// 剪枝1:同77.组合// 剪枝2:如果当前数已经大于n,那么该循环之后的数必定都大于n,执行剪枝for (int i = num; i <= 9 - (k - path.size()) + 1 && sum + i <= n; ++i) {sum += i;path.push_back(i);backtracking(i + 1, k, n);sum -= i;path.pop_back();}
}vector<vector<int>> combinationSum3(int k, int n) {backtracking(1, k, n);return ans;
}
17.电话号码的字母组合
本题与前两题组合的差别:
1、之前的组合是在一个集合中选取元素进行组合,本题是在多个集合中进行组合
2、本题中多了一步从数字映射到字母的操作
因为本题在多个集合中选取元素进行组合,不需要考虑剪枝操作。所以综上来看,理解了映射后其实本题比前两天组合还要简单。
回溯三部曲:
· 参数:
map<int, vector<char>> dict:用于将数字映射到字符数组的哈希表
vector<string>:存放最终结果的全局变量
string path:存放当前路径下组合的字符串(相当于一个一维数组)
int num:本次递归从digits[num]开始搜索
string& digits:题意中的数字字符串
· 终止条件:组合中的元素个数等于digits中的元素个数,说明完成组合,将结果进行保存并返回
· 单层逻辑:
获取当前数字的映射数组
节点操作:当前组合(path)中添加当前值(letter[i])
递归:获取digits中的下一个数字进行组合(递归参数传入num+1)
回溯:letter[i]在该位置的所有组合已经全部收集完成,将letter[i]弹出当前组合
map<int, vector<char>> dict;
vector<string> ans;
string path;void backtracking(int num, string& digits) {if (path.size() == digits.size()) {ans.push_back(path);return;}vector<char> letters = dict[digits[num] - '0']; // 将字符映射为数组 for (int i = 0; i < letters.size(); ++i) {path.push_back(letters[i]);backtracking(num + 1, digits);path.pop_back();}
}// 相比于之前的组合问题,就多了一步映射的操作
vector<string> letterCombinations(string digits) {dict.insert({ 2, {'a', 'b', 'c'} });dict.insert({ 3, {'d', 'e', 'f'} });dict.insert({ 4, {'g', 'h', 'i'} });dict.insert({ 5, {'j', 'k', 'l'} });dict.insert({ 6, {'m', 'n', 'o'} });dict.insert({ 7, {'p', 'q', 'r', 's'} });dict.insert({ 8, {'t', 'u', 'v'} });dict.insert({ 9, {'w', 'x', 'y', 'z'} });if (digits.empty())return {};backtracking(0, digits);return ans;
}
自己还想了一种基于队列的解法:
vector<string> letterCombinations(string digits) {// 创建用于映射的哈希表map<int, vector<char>> dict;dict.insert({ 2, {'a', 'b', 'c'} });dict.insert({ 3, {'d', 'e', 'f'} });dict.insert({ 4, {'g', 'h', 'i'} });dict.insert({ 5, {'j', 'k', 'l'} });dict.insert({ 6, {'m', 'n', 'o'} });dict.insert({ 7, {'p', 'q', 'r', 's'} });dict.insert({ 8, {'t', 'u', 'v'} });dict.insert({ 9, {'w', 'x', 'y', 'z'} });vector<string> ans;// 保存组合过程的队列,初始有一个空字符串queue<string> path;path.push("");string temp;for (int i = 0; i < digits.size(); ++i) {// 获取数字对应的字符数组vector<char> letters = dict[digits[i] - '0'];// 将需要操作的元素取出队列,与字符数组中的字符逐个组合并压入队尾while (path.front().size() == i) {temp = path.front();path.pop();for (char c : letters) {path.push(temp + c);// 当前组合长度等于digits长度时收集结果if (i + 1 == digits.size())ans.push_back(temp + c);}}}return ans;
}相关文章:
代码随想录算法训练营Day25 | 216.组合总和III、17.电话号码的字母组合
216.组合总和III 与77.组合差不多,就返回条件中收集结果步骤多了一步判断,同时剪枝策略多了一种 vector<vector<int>> ans; vector<int> path; int sum 0;void backtracking(int num, int& k, int& n) {if (path.size() k…...
故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab)
效果一览 文章概述 故障诊断 | 一文解决,SVM支持向量机的故障诊断(Matlab) 支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,用于分类和回归分析。SVM的主要目标是找到一个最优的超平面(或者在非线性情况下是一个最优的超曲面),将不同类别的样本分开…...
12.1 Web开发_DOMBOM:JS关联CSS(❤❤)
12.1 Web开发_DOM&BOM 1. DOM&BOM2. DOM:文档对象模型2.1 获取页面元素1. getElementById2. getElementsByClassName3. querySelector3. 事件3.1 事件三要素3.2 绑定事件的三种方式1. 标签on2. 对象.on事件3. addEventListener3.3 常用事件...
scoped样式隔离原理
在 Vue 中,作用域样式(Scoped Styles)是通过以下原理实现的: 1、唯一选择器: 当 Vue 编译单文件组件时,在样式中使用 scoped 特性或 module 特性时,Vue 会为每个样式选择器生成一个唯一的属性…...
降价不是杀手锏,和府捞面打起“养生牌”
餐饮,“走进来”易,“走上去”难。 作为一个低门槛的创业赛道,每年都有数以万计怀着掘金梦的创业者涌入餐饮业。但是,每年也有无数个理由让餐饮经营者黯然离场。根据辰智大数据预测,2023全年餐饮开店率35.5%ÿ…...
在WORD中设置公式居中编号右对齐设置方式
1 软件环境 Office Microsoft Office LTSC 专业增强版2021 2 最终效果 3 操作步骤 编辑公式;光标定位到公式的最后(不是行的最后);输入#编号光标定位在公式最后(不是行的最后),按Enter键回车…...
如何使用 Supabase Auth 在您的应用程序中设置身份验证
在本文中,您将学习基本的关键概念,这些概念将帮助您掌握身份验证和授权的工作原理。 您将首先了解什么是身份验证和授权,然后了解如何使用 Supabase auth 在应用程序中实现身份验证。 (本文内容参考:java567.com&…...
带libc源码gdb动态调试(导入glibc库使得可执行文件动态调试时可看见调用库函数源码)
文章目录 参考部分查看源码是否编译时有-g调试信息和符号表在 gdb 中加载 debug 文件/符号表将 debug 文件放入 ".debug" 文件夹通过 gdb 命令 set debug-file-directory directories GCC的gcc和g区别指定gcc/g,glibc的版本进行编译指定gcc/g的版本指定gl…...
初级通信工程师-通信动力与环境
1、 动力与环境的组成和基本要求 ● 动力与环境的组成: 通信电源系统、机房空调系统、动力环境集中监控管理系统与能耗监测管理系统和接地系统与防雷系统。 ● 网络通信设备对动力与环境的基本要求: 网络通信设备对动力与环境最根本的要求,…...
clickhouse在MES中的应用-跟踪扫描
开发的MES,往往都要做生产执行跟踪扫描,这样会产生大量的扫描数据,用关系型数据库,很容易造成查询冲突的问题。 生产跟踪扫描就发生的密度是非常高的,每个零部件的加工过程,都要被记录下来,特别…...
适用于嵌入式单片机的压缩算法
1. 简介 因为MCU的内存和算力的限制,那些对内存消耗大或算力需求大的压缩算法就不适合在MCU中使用。适用于MCU的压缩算法主要有:RLE、LZ77、Huffman、LZO、DEFLATE、LZ4。 2. 算法 2.1. RLE RLE(Run Length Encoding),也称为行程编码&…...
软件工程(最简式总结)
目录 第一章:概述 1.软件危机的表现原因 2.常见的软件开发方法包括: 3.软件工程基本原则 4.软件工程三要素 5.设计模式的分类 6.针对变换型数据流设计步骤 7.针对事务型数据流设计步骤 第二章:软件过程 1.软件生命周期 2.软件过程模型 &…...
Docker基础(持续更新中)
# 第1步,去DockerHub查看nginx镜像仓库及相关信息# 第2步,拉取Nginx镜像 docker pull nginx# 第3步,查看镜像 docker images # 结果如下: REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 60…...
Vue工程引入Element-ui
npm 安装ELement-ui npm i element-ui -S 于package.json中发现有“element-ui”版本号即可 引入 Element 在 main.js 中写入以下内容: import element-ui/lib/theme-chalk/index.css; import ElementUI from element-ui;Vue.use(ElementUI);之后根据自己的需求设计…...
算法学习——华为机考题库9(HJ56 - HJ63)
算法学习——华为机考题库9(HJ56 - HJ63) HJ56 完全数计算 描述 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和&…...
Maven安装,学习笔记,详细整理maven的一些配置
Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后,我们即将开始学习后端Web开发技术。做为一名Java开发工程师,后端 Web开发技术…...
STM32--USART串口(2)串口外设
一、USART简介 可配置数据位:不需要校验就是8位,需要校验就选9位; 停止位:决定了帧的间隔; STM32F103C8T6USART:USART1挂载在APB2总线上,USART2和USART3挂载在APB1总线上; 二、USART框图 TXE…...
Unity之做一个最简单的FPS游戏demo
目录 😋FPS游戏Demo 💤1.新建FPS模板项目 ⚒️2.装备枪 💣3.设置射击功能 📺4.制造一个子弹预制体 🎮5.发射子弹 说起来小编学Unity差不多一个月了,都是利用上班摸鱼时间学的(doge.jpg&…...
【Springboot】单元测试Junit5应用
JUnit 5是一个功能强大的测试框架,常用于编写和执行这些单元测试。以下是一些JUnit 5中的常用注解、断言、前置条件、嵌套测试和参数化测试的例子: 1.环境启动 SpringBootTest 注解: classes SmartApplication.class:这个属性…...
【INTEL(ALTERA)】内部错误:子系统:PTI,文件:/quartus/tsm/pti/pti_delay_annotator.cpp
说明 由于英特尔 Quartus Prime Pro Edition 软件 23.2 及更早版本存在问题,因此在编译设计的 Retime 期间可能会出现此错误。 解决方法 此问题已在英特尔 Quartus Prime Pro Edition 软件 v23.3 中修复。 要在版本 23.2 中解决此问题,请通过以下相应链…...
G-Helper终极指南:颠覆性轻量级华硕笔记本性能控制解决方案
G-Helper终极指南:颠覆性轻量级华硕笔记本性能控制解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...
WinCC TIA Portal数据交换实战:用VBS脚本玩转XML导入导出(附避坑指南)
WinCC TIA Portal数据交换实战:用VBS脚本玩转XML导入导出(附避坑指南) 在工业自动化项目中,数据交换是连接控制系统与上层信息系统的关键桥梁。WinCC作为西门子TIA Portal中的重要组件,其数据交互能力直接影响着生产报…...
OpenClaw资源监控方案:Qwen3.5-9B运行时性能调优
OpenClaw资源监控方案:Qwen3.5-9B运行时性能调优 1. 为什么需要关注资源监控? 去年冬天,我第一次在本地MacBook Pro上部署Qwen3.5-9B模型时,系统突然卡死的经历让我记忆犹新。当时我正在运行一个简单的文档摘要任务,…...
老旧Mac终极重生指南:OpenCore Legacy Patcher完整教程
老旧Mac终极重生指南:OpenCore Legacy Patcher完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款强大的开源…...
突破安卓截图封锁:Xposed-Disable-FLAG_SECURE技术探秘与实战指南
突破安卓截图封锁:Xposed-Disable-FLAG_SECURE技术探秘与实战指南 【免费下载链接】Xposed-Disable-FLAG_SECURE Xposed Module to Disable FLAG_SECURE, enabling screenshots, screen sharing and recording in apps that normally wouldnt allow it. 项目地址:…...
解决GitHub打不开问题,顺利获取Lingbot模型开源代码与资源
解决GitHub打不开问题,顺利获取Lingbot模型开源代码与资源 你是不是也遇到过这种情况?项目开发到一半,需要去GitHub上拉取一个关键的模型代码,比如最近很火的Lingbot-Depth-Pretrain-ViTL-14,结果页面一直转圈圈&…...
Phi-3-Mini-128K多模型协作实践:与Claude Code协同完成复杂编程任务
Phi-3-Mini-128K多模型协作实践:与Claude Code协同完成复杂编程任务 1. 引言 你有没有遇到过这样的情况?面对一个稍微复杂的编程任务,比如要搭建一个带用户管理的小型Web应用,你让一个AI助手来帮忙。它可能很快给你生成了一段登…...
注意力机制解析:PETRv2-BEV时空特征融合的可视化研究
注意力机制解析:PETRv2-BEV时空特征融合的可视化研究 1. 当我们说“注意力”时,到底在关注什么 很多人第一次听到“注意力机制”这个词,会下意识联想到人眼聚焦某个物体的动作。这种直觉其实很准确——在PETRv2-BEV这类模型里,“…...
Leather Dress Collection 实战:为开源项目自动生成 README 与贡献指南
Leather Dress Collection 实战:为开源项目自动生成 README 与贡献指南 你有没有过这样的经历?辛辛苦苦写好了一个开源项目,代码功能强大,架构清晰,但一想到要写 README、贡献指南、行为准则这些文档,头就…...
Instructions版本迁移终极指南:从1.x到2.x的5个关键升级步骤
Instructions版本迁移终极指南:从1.x到2.x的5个关键升级步骤 【免费下载链接】Instructions Create walkthroughs and guided tours (coach marks) in a simple way, with Swift. 项目地址: https://gitcode.com/gh_mirrors/in/Instructions Instructions是一…...
