代码随想录算法训练营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 中解决此问题,请通过以下相应链…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...