【算法练习Day22】 组合总和 III电话号码的字母组合
📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待
文章目录
- 组合总和 III
- 剪枝
- 电话号码的字母组合
- 总结:
组合总和 III
216. 组合总和 III - 力扣(LeetCode)
组合总和3和上一期的组合思路上差不太多,用数字1-9相当于上一道组合题的1-n的范围求解答案,而这道题多了一个要想加等于一个固定的数值。
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int targetSum,int k,int sum,int startIndex){if(path.size()==k){if(sum==targetSum){result.push_back(path);}}for(int i=startIndex;i<=9;i++){sum+=i;path.push_back(i);backtracking(targetSum,k,sum,i+1);sum-=i;path.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {result.clear();path.clear();backtracking(n,k,0,1);return result;}
};
我们直接向数组里加入数据,因为我们暂时不能确定怎样的组合才能凑够n,所以我们当数组里元素等于k个数据时,直接判断一下,如果此时总和等于我们想要的答案,那么直接加入答案数组,否组向上一层直接返回。而下面的单层递归逻辑是我们仍然用一个start作为开始的下标来记录避免取到重复下标,将1-9每一个数都加入进来试错,直到找出正确答案。
剪枝
这道题也同样存在可以剪枝的部分,这道题可以分成两部分的剪枝,也很巧妙。
第一部分的剪枝原因在于这道题是组合求和,它给出了一个相加之和为n的组合,这个时候我们可以判定当我们此时递归的时候,sum当前组合内的值,如果大于了给定的目标值n,那么很明显我们一定要return了,因为是在1-9中取数,都是正数,怎么加也不可能找的到了。所以第一部分剪枝一定是写在判断部分的代码里,这和上一期的组合是有所区别的。
相似的剪枝是第二部分的剪枝, 仍然是采用之前的做法剪枝,path.size()是当前数组中所存的数据有几个,k-path.size()是还需要几个数字,9-(k-path.size())+1,是我们最多可以从哪个数字向下进行递归,这里的数是从1-9的,不是从数组中取数,最开始不是0而是1,所以要加1。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtraking(int k,int n,int start,int sum){if(sum>n) return;if(path.size()==k)if(sum==n){result.push_back(path);return;}for(int i=start;i<=9-(k-path.size())+1;i++){path.push_back(i);backtraking(k,n,i+1,sum+i);path.pop_back();}
}vector<vector<int>> combinationSum3(int k, int n) {backtraking(k,n,1,0);return result;}
};
个人认为的缺陷
第一部分的剪枝是为了避免当sum>n时候继续递归,第二部分剪枝是告诉最多从哪里开始递归,第二部分的剪枝是完全根据传进答案的个数做的剪枝,与最终结果n无关。
那么当n=100时候,k=2时候我们还是无法快速的判断当前是无法找的出正确的答案的,看到这里可能会去想,如果是这种情况还是能很快的判断啊,通过第二次剪枝很快就根据k跳出递归了,那如果n很大,k也很大,但是k大也不足以凑出n呢?那还是会进行很多次递归-回溯的过程吧,做了很多次的搜索但是却一个结果都无法返回,但是好像暂时也没有其他什么方法能够比它更好用了。
电话号码的字母组合
17. 电话号码的字母组合 - 力扣(LeetCode)
这道题也是组合题,不过略有一些难度。首先我们要根据它给出的电话按键,用map或者数组将其数值所对应的字母都保存起来。然后再构思回溯函数,同样的也是创建一个结果数组,创立一个中间存数据的数组。这里我们并不需要像start一样作用的变量来指示我们下一次要走向哪一个下标,因为这里我们是同时操作多个数组,往里面加入数据,我们需要的是一个变量告诉我们该遍历哪一个电话按键了它指向的是传进来的电话号码序列的下标。
由于这样的缘故,所以我们结束条件可以确定是该变量等于函数传进来的电话号码字符串的字符个数,这里有一些疑问,为什么我们这个这个变量是表示下标你还要它等于字符序列总个数呢?而不是总序列个数减一,原因是我们在遍历到最后一个字符时我们仍然需要将最后一个数字对应的字母排列进来,而不是直接跳出循环,所以我们要等待它这个下标指向最后一个字符的下一个时候,才能来做判断。当它与字符序列的个数相等时我们收获结果,并想上一层返回,以寻求其他结果。
class Solution {
public:string lettermap[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> result;string s;void backtracking(const string& digits,int index){if(index==digits.size()){result.push_back(s);return;}int digit=digits[index]-'0';string letters=lettermap[digit];for(int i=0;i<letters.size();i++){s.push_back(letters[i]);backtracking(digits,index+1);s.pop_back();}}vector<string> letterCombinations(string digits) {s.clear();result.clear();if(digits.size()==0){return result;}backtracking(digits,0);return result;}
};
这里有一些需要我们注意的,我们要在循环内创立一个整形来存储该字符序列的某个位置它所代表的数字是什么,然后才是用另一个字符串变量来记录该数字所对应的字母序列,我们仅需要一个变量来指示下标的原因在上面已经说过了,而当它返回到上一层之后,我们如何找到上一次对应的电话号码的字母的下一位呢?这是递归返回后i++所要做的事情,我们完全不需要担心,其他的单层逻辑和那些组合题大体一样,不做赘述。
总结:
今天我们完成了组合总和 III\电话号码的字母组合两道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。
当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~
相关文章:

【算法练习Day22】 组合总和 III电话号码的字母组合
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 组合总和 III剪枝 电话号码…...
react-------JS对象、数组方法实际应用集合
目录 1、向空对象里添加键值对 2、js在数组对象中添加和删除键值对(对象属性)的方法 2.1 添加 3、对已有的数据更换键值对的属性名 4、js字符串拼接、数组转字符串 5、从数组中提取元素 1、向空对象里添加键值对 对象的属性可以使用[ ] 或者 . 而…...
AWS SAP-C02教程6--安全
云的安全是一个重要的问题,很多企业不上云的原因就认为云不安全,特别是对安全性要求较高的企业,所以云安全是一个非常广泛且重要的话题,其实在之前章节中的组件都会或多或少讲述与其相关的安全问题,这里也会详细讲一下。本章主要通过讲述一些独立或与安全有关的组件以及网…...

Go学习第一章——开发环境安装以及快速入门(GoLand)
Go开发环境安装以及快速入门 一、环境配置1.1 go开发工具1.2 go sdk下载3.1 go相关命令行 二、快速入门2.1 创建项目2.2 创建.go程序文件2.3.配置 mod 的开启与关闭2.4 用 GoLand 写第一份代码2.5.代码静态检测(此部分非必要) 三、初步了解3.1 代码解释以…...
大数据学习(14)-Map Join和Common Join
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…...

Docker安装ES7.14和Kibana7.14(无账号密码)
一、Docker安装ES7.14.0 1、下载镜像 docker pull elasticsearch:7.14.0 2、docker安装7.14.0 mkdir -p /usr/local/elasticsearch/config mkdir -p /usr/local/elasticsearch/data chmod 777 -R /usr/local/elasticsearch/ echo "http.host: 0.0.0.0" >> /u…...

Zynq中断与AMP~双核串口环回之PS与PL通信
实现思路: 额外配置:通过PL配置计数器,向CPU0和CPU1发送硬中断。 1.串口中断CPU0,在中断中设置接收设置好字长的数据,如果这些数据的数值符合约定的命令,则关闭硬中断,并将这部分数据存入AxiLi…...

【一:实战开发testng的介绍】
目录 1、主要内容1.1、为啥要做接口测试1.2、接口自动化测试落地过程1.3、接口测试范围1.4、手工接口常用的工具1.5、自动化框架的设计 2、testng自动化测试框架基本测试1、基本注解2、忽略测试3、依赖测试4、超时测试5、异常测试6、通过xml文件参数测试7、通过data实现数据驱动…...
C现代方法(第9章)笔记——函数
文章目录 第9章 函数9.1 函数的定义和调用9.1.1 函数定义9.1.2 函数调用 9.2 函数声明9.3 实际参数9.3.1 实际参数的转换9.3.2 数组型实际参数9.3.3 变长数组形式参数(C99)9.3.4 在数组参数声明中使用static(C99)9.3.5 复合字面量 9.4 return语句9.5 程序终止9.5.1 exit函数 9.…...

【算法练习Day23】 复原 IP 地址子集子集 II
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 复原 IP 地址子集子集 II总…...

fastadmin框架token验证
在FastAdmin框架中,Token验证是一种常见的身份验证方法,用于确保用户请求的安全性和合法性。本文将介绍如何在FastAdmin框架中实现Token验证。 什么是Token验证? Token验证是一种基于令牌(Token)的身份验证方式。在这种方式下,用…...

了解 AI :了解 AI 方面的一些术语 (中英文对照)
本心、输入输出、结果 文章目录 了解 AI :了解 AI 方面的一些术语 (中英文对照)前言AI 方面的一些术语 (中英文对照)AI 方面的一些术语 (中英文对照) - 文字版弘扬爱国精神 了解 AI :…...
【Python学习笔记】对象、方法
1. 对象方法定义 对象通常都拥有属于自己的 方法(英文叫 method )。 对象的方法其实可以看成是对象所拥有的函数。也就是说 这个方法,是属于这个对象的函数。 调用对象的方法,和调用函数差不多,只要在前面加上 所属…...

企业IT资产设备折旧残值如何计算
环境: 企业/公司 IT资产 问题描述: 企业IT设备折旧残值如何计算? 解决方案: 1.按三年折旧 净值原值-月折旧额折旧月份 , 月折旧额原值(1-3%)/36 折旧月份ROUND(E2*(1-3%)/36,2) 2.净值E2-F2*G2...
Linux性能优化--性能工具:下一步是什么
13.0 概述 本章是对一些事情的思索,包括:Linux性能工具的当前状态,哪些仍需要改进以及为什么Linux是当前一个相当不错的进行性能调查的平台。 阅读本章后,你将能够: 了解Linux性能工具箱的漏洞,以及一些理…...

网工内推 | IT主管、高级网工,上市公司,必须持有HCIE认证
01 深圳市飞荣达科技股份有限公司 招聘岗位:高级网络工程师 职责描述: 1. 参与、负责集团公司IT基础技术架构的规划设计、实施及维护、性能优化,包括数据中心机房、网络架构、虚拟化平台、信息安全设备及灾备系统等; 2. 负责集团…...

bulldog 靶机
bulldog 信息搜集 存活检测 详细扫描 后台网页扫描 网页信息搜集 正在开发的如果你正在读这篇文章,你很可能是Bulldog Industries的承包商。恭喜你!我是你们的新老板,组长艾伦布鲁克。CEO解雇了整个开发团队和员工。因此,我们需要迅速招到一…...

如何借助边缘智能网关打造智慧城市便民驿站
智慧城市驿站是一类提供多样化便利服务的新型智能公共设施,通过融合物联网技术、边缘智能技术、新能源技术等,为城市居民整合提供休闲、购物、卫生、广告、安全等公共服务,进一步提升日常生活体验。本篇就为大家介绍如何基于边缘智能网关&…...

谈谈电商App的压测
背景 最近恰逢双十一,大大小小的电商app在双十一之前都会做一次压测,曾经在小公司工作的时候很想知道大公司是如何压测的,有什么高深的压测工具没,本文就来揭露一下 压测真相 在确认使用什么压测工具进行压测之前,我…...
VsCode修改侧边栏字体大小——用缩放的方法
缩放界面字体百分比(包括编辑器界面) 如果只修改文本编辑区的字体大小,可以在File -> Preferences -> Settings 中修改font的大小。但是侧边栏的字体不会改变,所以可以使用缩放的方法先修改整个界面的字体大小,…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...